¿Puede OpenSSL descifrar la firma cifrada en una solicitud de Amazon Alexa a un servicio web?

4

El novato de OpenSSL aquí.

Estamos utilizando OpenSSL para analizar y verificar el certificado y la firma que Amazon Alexa envía a los servicios web externos, siguiendo su lista de requisitos en las instrucciones here .

Estamos extrayendo con éxito la clave pública, verificando las fechas de inicio / finalización del certificado, verificando que echo-api.amazon.com sea el sujeto del certificado y verificando la cadena de confianza (utilizando la línea de comandos OpenSSL funciones).

Pero estamos atascados en el punto en el que la documentación de Amazon dice "Use la clave pública extraída del certificado de firma para descifrar la firma cifrada para generar el valor hash declarado".

¿Es esto posible con OpenSSL? El comando openssl "rsautl -decrypt" es solo para claves privadas (tanto la documentación como nuestras pruebas lo confirman, y las claves públicas son rechazadas, incluso con la opción -pubin).

Alternativamente, ¿hay una manera de hacer que el archivo openssl dgst -verify funcione para la verificación de la firma Alexa?

Estamos probando estos comandos:

openssl base64 -d -in (signature_file) -out /tmp/sign.sha256 
openssl dgst -sha256 -verify (pub-key_file) -signature /tmp/sign.sha256 (file)

Hemos utilizado la función getHttpRequestData().headers["Signature"] de ColdFusion para obtener la firma:

lOtMJdnw8fffdJHkiM2I6m+K0IqkMCeAWJrjoYGVtkGEBYXUOUazKh6/rpM6opxni7YMHJkA6x5/eGGmWg++VP
0+2I/TNQjR9TTu1LVKikGyi9Oskk/od/tKzEhyWJ2noyyrybqRG1bTSLjVqc1RxDLLRbDuOs12s5F6E0bL18pG
EAww6iMKr2m212wrVzJ2pehp8wVMcqlegOaXW2iFlAunWwte7E/br4vdsYiAXZRLg2uVBDvjmpeo4b9GJZbZkE
HhV+/x+KOwXCISl+Ao0BTr/pzfuF4m/oWpX1PC91hwYMSiVn9I+a+VDxKVxSVllCrffIAIc9mETVuc9U0XRA==

Y la función Coldfusion GetHttpRequestData().content devuelve la estructura JSON enviada al servicio web:

{  
   "version":"1.0",
   "session":{  
      "new":true,
      "sessionId":"SessionId.29d1522f-6ea6-4aba-b782-f41890388569",
      "application":{  
         "applicationId":"amzn1.ask.skill.63fd6ac5-ed2b-4324-995c-681f96f428a6"
      },
      "attributes":{  

      },
      "user":{  
         "userId":"amzn1.ask.account.AHURACZZDQ43ZMUVTOQBEGB5JMWOZCFJRFYXCO26O2IZ3JRS6HYKBOOXPEM6BNWLPUM2E6EWCDC4Q2DPFHXSE3EJT4BLL4CWDNDIFASIHIV2D4AJDH7MDICIFVMHK252EBVQOGFR2TH4HNGMMTPOHI5VGQD7O4UWPZOL2FQOGRCNMVUPUI3SC2R2EH5L5V6XD7B7IF544TYJJCA"
      }
   },
   "request":{  
      "type":"IntentRequest",
      "requestId":"EdwRequestId.d8e9d467-b311-4d9c-8273-9ba0b1e07613",
      "timestamp":"2017-05-11T18:49:37Z",
      "locale":"en-US",
      "intent":{  
         "name":"GetRssFeedHeadlines",
         "slots":{  
            "RSSFeedLabel":{  
               "name":"RSSFeedLabel",
               "value":"top news"
            }
         }
      }
   }
}

Aquí está la clave pública:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnK+zBruRA1TnbgQGxE+b
4XiTTZyDkGwJ6068AGsXQmgt9lVhC8CTTC4wdR5NXosboV6/63worQCNo412csBV
jUy3H1/VEs+5Kv+AiAOUuKoBfEU8zAvHCc7GmOKUgNidcDA0MSpx3ZTMSGGbkfaL
ikRzne6nFZ6jNOnkqTtGD6SrCIYgLNArScYoPzIcXEypHFrognzrR4Ee0YcefGZy
S81Yqev/lli01dAgRvpnAty68rYTmxkNhzUSG6IIbFHIxXJKAETAkGiKJcgZpfG2
1Ok5Dk3yGrESY/ID5OnxvMxiXSnXwht8JD6bd15ui0tPDa85B0jpZLloqQZe26oR
owIDAQAB
-----END PUBLIC KEY-----

Pero openssl dgst siempre devuelve un mensaje de "Verificación fallida" cuando usamos openssl dgst -verify con los archivos que contienen la firma (en proceso de prueba y decodificación Base64) y el cuerpo de solicitud http (listado arriba).

Cualquier orientación sería muy apreciada!

    
pregunta Christopher Ryan 12.05.2017 - 04:12
fuente

1 respuesta

4

Primero, Amazon y usted están repitiendo un tropo común pero incorrecto; la firma no es cifrado con la clave privada , ni siquiera para RSA, donde hay una similitud suficiente en el apuntalamiento matemático que es peligrosamente atractivo pensar esto aunque existen diferencias vitales en los esquemas reales y tratar de intercambiarlos lleva a muy malos resultados, y no lo es en absoluto para otros algoritmos como DSA y ECDSA. Consulte:
¿Intenta comprender RSA y su terminología?
¿Es peligroso cifrar los datos con una clave privada?
Si la clave pública puede no se utiliza para descifrar algo cifrado por la clave privada, entonces, ¿cómo funcionan las firmas digitales?
Comprensión de las certificaciones digitales
¿Firma digital y verificación?
Con GPG, puedes "reprochar pt "¿un archivo que no se ha cifrado?
¿Por qué debo firmar datos que ya están encriptados?
¿Es peligroso encriptar datos con una clave privada?
¿El cifrado RSA siempre almacena pequeñas cantidades de datos en un tamaño mayor?
enlace
enlace
enlace
(Algunos de los cuales admito son difíciles de encontrar a menos que sepa lo que está buscando).

Dicho esto , openssl rsautl puede recuperar el hash rellenado firmado de una firma mediante la opción -verify , y el% más reciente pkeyutl con (más claro) -verifyrecover ; dada su firma de-base64-ed en temp.sig y su publicación en temp.key :

$ openssl rsautl -verify -pubin -inkey temp.key <temp.sig |openssl asn1parse -inform der
    0:d=0  hl=2 l=  33 cons: SEQUENCE
    2:d=1  hl=2 l=   9 cons: SEQUENCE
    4:d=2  hl=2 l=   5 prim: OBJECT            :sha1
   11:d=2  hl=2 l=   0 prim: NULL
   13:d=1  hl=2 l=  20 prim: OCTET STRING      [HEX DUMP]:AE2F2DD493F3E58F62E9F20678D9A05B86E06F8A

Observe este es un hash SHA-1 , como se indica en la página de Amazon que vincula, no SHA-256, y coincide con el hash SHA-1 de sus datos:

 $ openssl sha1 <temp.dat
 (stdin)= ae2f2dd493f3e58f62e9f20678d9a05b86e06f8a

y, por lo tanto, se puede verificar con dgst -verify

 $ openssl sha1 <temp.dat -verify temp.key -signature temp.sig
 Verified OK
    
respondido por el dave_thompson_085 12.05.2017 - 08:47
fuente

Lea otras preguntas en las etiquetas