OpenSSL può decodificare la firma crittografata in una richiesta Amazon Alexa su un servizio web?

4

OpenSSL newbie qui.

Usiamo OpenSSL per analizzare e verificare il certificato e la firma che Alexa di Amazon invia ai servizi web esterni, seguendo il loro elenco di requisiti nelle istruzioni qui .

Stiamo estraendo con successo la chiave pubblica, controllando le date di inizio / fine del certificato, verificando che echo-api.amazon.com sia l'oggetto del certificato e verificando la catena di attendibilità (utilizzando la riga di comando di OpenSSL funzioni).

Ma siamo bloccati nel punto in cui la documentazione di Amazon dice "Usa la chiave pubblica estratta dal certificato di firma per decodificare la firma crittografata per produrre il valore hash asserito."

Questo è possibile con OpenSSL? Il comando openssl "rsautl -decrypt" è solo per le chiavi private (sia la documentazione che i nostri test lo confermano e le chiavi pubbliche vengono rifiutate, anche con l'opzione -pubin).

In alternativa, c'è un modo per ottenere che openssl dgst -verify funzioni per la verifica della firma di Alexa?

Stiamo testando questi comandi:

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

Abbiamo utilizzato la funzione getHttpRequestData().headers["Signature"] di ColdFusion per ottenere la firma:

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

E la funzione% diGetHttpRequestData().content di Coldfusion restituisce la struttura JSON inviata al servizio 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"
            }
         }
      }
   }
}

Ecco la chiave pubblica:

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

Ma openssl dgst restituisce sempre un messaggio di "Verification Failed" quando usiamo openssl dgst -verify con i file contenenti la firma (cercando raw e Base64-decodificato) e il corpo della richiesta http (elencato sopra).

Qualsiasi guida sarebbe molto apprezzata!

    
posta Christopher Ryan 12.05.2017 - 04:12
fonte

1 risposta

4

In primo luogo, Amazon e tu stai ripetendo un tropo comune ma sbagliato; signature non è la crittografia con la chiave privata - nemmeno per RSA, dove c'è abbastanza somiglianza nella base matematica che è pericolosamente attraente pensarlo anche se ci sono differenze vitali negli schemi reali e cercare di interscambiarli porta a risultati pessimi, e del tutto completamente non per tutti gli altri algoritmi come DSA ed ECDSA. Vedi:
Cercando di capire RSA e la sua terminologia?
La crittografia dei dati con una chiave privata è pericolosa?
Se la chiave pubblica può essere usato per decodificare qualcosa criptato dalla chiave privata, allora come funzionano le firme digitali?
Comprensione delle certificazioni digitali
Firma digitale e verifica?
Con GPG, puoi "condannare" pt "un file che non è stato crittografato?
Perché dovrei firmare i dati che sono già crittografati?
La crittografia dei dati con una chiave privata è pericolosa?
La crittografia RSA riempie sempre piccole quantità di dati a dimensioni più grandi?
link
link
link
(alcuni dei quali ammetto sono difficili da trovare se non sai cosa stai cercando).

Detto questo , openssl rsautl può recuperare l'hash riempito firmato da una firma usando l'opzione -verify e la più recente pkeyutl con (più chiaro) -verifyrecover ; data la tua firma de-base64-in temp.sig e la tua chiave pubblica in 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

Osserva questo è un hash SHA-1 , come indicato nella pagina di Amazon che colleghi, non SHA-256, e corrisponde all'hash SHA-1 dei tuoi dati:

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

e quindi può essere verificato con dgst -verify

 $ openssl sha1 <temp.dat -verify temp.key -signature temp.sig
 Verified OK
    
risposta data 12.05.2017 - 08:47
fonte

Leggi altre domande sui tag