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!