Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用openssl_public_decrypt对Alexa请求签名进行解密时出现问题_Php_Alexa_Pem_Php Openssl - Fatal编程技术网

Php 使用openssl_public_decrypt对Alexa请求签名进行解密时出现问题

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

我正在为实现一个验证器。我正在进行第5步和第6步,其中说明:

5) base64解码请求上的签名头值以获得加密签名

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
返回的似乎不是
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)