使用openssl_public_decrypt发出解密Alexa请求签名的问题

时间:2017-09-24 12:41:03

标签: php alexa pem php-openssl

我正在为validating incoming requests from Amazon Alexa实施验证器。我在第5步和第6步说明:

  

5)base64-解码请求上的Signature标头值以获取加密签名。

     

6)使用从签名证书中提取的公钥解密加密签名,以生成断言的哈希值。

我设法通过执行以下操作从PEM编码的X.509证书中提取公钥:

$publicKey = openssl_pkey_get_public($pem);
$keyData = openssl_pkey_get_details($publicKey);

返回我的公钥。然后我试图像这样解密签名:

openssl_public_decrypt(base64_decode($this->signature), $decryptedSignature, $keyData['key']);

哪个应该返回请求正文的sha1哈希值,以便我与实际请求正文进行比较,但是我从$decryptedSignature返回的内容似乎不是{{1}哈希。我希望我错过了一些明显的东西,但我看不到它。

为了让事情变得简单,这是Alexa测试服务返回的真实生活sha1签名标题:

  

DElCRMK3sXkhmnmu3D2HzVyuLHJ3JkABuBy2LCRX + winUhV6pSC9p1ASKFi9DzESsCyQ74izlFSvi3zECbSbT45bI38JpARJlal81YpWKxz2zTX + y6Qi +我们/ bFHHpU4gZO7nTTVQDWG4ua6EuWDTt3jL4B + hPOzO1OKix0jHKQldaTd9meyanttZ5QK7WotBeS6xU + PUM / dmiQ + LM39NERUCrCRyeU07PUdQt + L5PI8MehMz5ClHFOTWgyjE / J / b4zrX4weppb / KJhqQVmbw79BWMPuaSwf6BIHyf + 4 + / NSMmoaJ2WMKKEXf1aV7ac71QFFx9pw4P0BX7DK / hqy98Q ==

这是从https://s3.amazonaws.com/echo.api/echo-api-cert-4.pem提取的公钥:

  

-----开始公钥-----   MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnK + zBruRA1TnbgQGxE + B   4XiTTZyDkGwJ6068AGsXQmgt9lVhC8CTTC4wdR5NXosboV6 / 63worQCNo412csBV   jUy3H1 /虚拟环境+ 5KV + AiAOUuKoBfEU8zAvHCc7GmOKUgNidcDA0MSpx3ZTMSGGbkfaL   ikRzne6nFZ6jNOnkqTtGD6SrCIYgLNArScYoPzIcXEypHFrognzrR4Ee0YcefGZy   S81Yqev / lli01dAgRvpnAty68rYTmxkNhzUSG6IIbFHIxXJKAETAkGiKJcgZpfG2   1Ok5Dk3yGrESY / ID5OnxvMxiXSnXwht8JD6bd15ui0tPDa85B0jpZLloqQZe26oR   owIDAQAB   ----- END PUBLIC KEY -----

1 个答案:

答案 0 :(得分:1)

好的,我意识到自己的错误。解密的签名以二进制形式返回,因此我需要执行:bin2hex($decryptedSignature)以获取sha1哈希值。奇怪的是,返回的签名哈希有30个额外的字符,所以实际的Alexa哈希比较需要:

public function compareHashes($pem) {

  $publicKey = openssl_pkey_get_public($pem);

  openssl_public_decrypt(base64_decode($this->signature), $decryptedSignature, $publicKey);

  $decryptedSignature = hex2bin($decryptedSignature);

  return sha1($this->responseBody) === substr($decryptedSignature, 30);
}

无论如何,一旦我通过Alexa认证,我将开源我的Alexa验证课程并在此处添加一个链接。

修改

我现在通过认证,所以这是我为Alexa验证写的课程:https://github.com/craigh411/alexa-request-validator