Php 使用openssl_public_decrypt对Alexa请求签名进行解密时出现问题
我正在为实现一个验证器。我正在进行第5步和第6步,其中说明: 5) base64解码请求上的签名头值以获得加密签名 6) 使用从签名证书提取的公钥对加密签名进行解密,以生成断言的哈希值 我已通过以下操作从PEM编码的X.509证书中提取公钥:Php 使用openssl_public_decrypt对Alexa请求签名进行解密时出现问题,php,alexa,pem,php-openssl,Php,Alexa,Pem,Php Openssl,我正在为实现一个验证器。我正在进行第5步和第6步,其中说明: 5) base64解码请求上的签名头值以获得加密签名 6) 使用从签名证书提取的公钥对加密签名进行解密,以生成断言的哈希值 我已通过以下操作从PEM编码的X.509证书中提取公钥: $publicKey = openssl_pkey_get_public($pem); $keyData = openssl_pkey_get_details($publicKey); 返回我的公钥。然后我尝试解密签名,如下所示: openssl_pub
$publicKey = openssl_pkey_get_public($pem);
$keyData = openssl_pkey_get_details($publicKey);
返回我的公钥。然后我尝试解密签名,如下所示:
openssl_public_decrypt(base64_decode($this->signature), $decryptedSignature, $keyData['key']);
它应该返回请求主体的sha1
散列,以便与实际请求主体进行比较,但从$decryptedSignature
返回的似乎不是sha1
散列。我希望我错过了一些明显的东西,但我看不到
为了让事情变得简单一点,下面是从Alexa的测试服务返回的真实base64_编码的
签名头:
2.在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在北京,在北京,在北京,在北京,在中国,在北京,在北京,在中国,在北京,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国,在中国PW4P0BX7DK/hqy98Q==
以下是从以下内容中提取的公钥:
-----开始公钥-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnK+Zbrura1TbGqgXe+b
4XiTTZyDkGwJ6068AGsXQmgt9lVhC8CTTC4wdR5NXosboV6/63worQCNo412csBV
jUy3H1/VEs+5Kv+AIAOUKOBFE8ZAVHCC7GMOKUGNIDCDA0MSPX3ZTMSGBKFAL
IKRZNE6NFZ6JNONKQTTGD6SRCIYGLNARSCYOPZICXEEYPFRONGZRR4EE0YCEFGZY
S81Yqev/lli01dAgRvpnAty68rYTmxkNhzUSG6IIbFHIxXJKAETAkGiKJcgZpfG2
1Ok5Dk3yGrESY/ID5ONXVMXIXSNXWHT8JD6BD15UI0TPDA85B0JPZLLOQZE26OR
奥维达卡布
-----结束公钥-----
好吧,我已经意识到我的错误了。解密后的签名以二进制形式返回,因此我需要执行:
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验证编写的课程:嗨,你的技能通过认证了吗。我正在使用这个库,你能帮我怎么做证书验证吗。请。谢谢。@gowri是的,我的技能通过了认证,我已经将Alexa请求的验证程序放在我的计算机上,您可以自由使用。实际上,我写这篇文章是因为我找不到任何其他正确实现所需验证的方法;有些只做任意检查,有些是意大利面代码(并错过了某些方面),有些没有正确验证签名链url或hash.Thx的回复。还有一件事,我要补充一点,所有意图中的验证器都只在
输入
意图中。我将返回HTTP状态代码,所有的意图都是这样的,比如HTTP\u response\u code(400)
。