我正在为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 -----
答案 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