openssl_verify():提供的密钥参数不能被强制转换为 .pem 文件的公钥
Posted
技术标签:
【中文标题】openssl_verify():提供的密钥参数不能被强制转换为 .pem 文件的公钥【英文标题】:openssl_verify(): supplied key param cannot be coerced into a public key for a .pem file 【发布时间】:2014-12-11 23:00:48 【问题描述】:目前正在尝试读取.pem
公钥以通过openssl
进行验证。
/**
* Check whether the signed message sent back by the server is
* correct or not.
*/
function check($str, $MAC)
$fp = fopen(
dirname(__FILE__) . '/rsa_public_key.pem',
'r'
);
$cert = fread($fp, 8192);
fclose($fp);
$pubkeyid = openssl_get_publickey($cert);
return openssl_verify($str, $MAC, $pubkeyid);
话虽如此,在执行我的脚本时,我收到此错误:
openssl_verify(): supplied key param cannot be coerced into a public key in some/path at line X
最初,我编写这个函数是为了接受.cer
认证。这是对所有这些different key formats 之间区别的解释。据我了解,.pem
与.cer
相似,但是,我终生无法弄清楚如何让我的脚本读取我的.pem
文件。
我的问题是 - 我需要做什么才能让我的函数读取此公钥?
编辑:通过谷歌搜索,我尝试使用 file_get_contents()
到特定路径,但我会收到相同的错误。
什么可能导致这个错误?
【问题讨论】:
【参考方案1】:打开这个.pem
文件后,所有内容都在一行中。看来每行需要 64 个字符的长度,所以我确保每行是 64 行,并且成功解析。与.cer
无关。
【讨论】:
你的意思是你确定每行是 64 个字符? Base64 块的每一行,我想,不是页眉/页脚行。 @theGreenCabbage,答案中包含代码会更有价值。 @theGreenCabbage 我们有没有机会在chat.***.com/rooms/137297/… 继续交谈?【参考方案2】:此外,-----BEGIN PUBLIC KEY-----
和-----END PUBLIC KEY-----
行的每一侧应包含正好五个 破折号。不多也不少。六号马上就出来了。
最后一行的末尾可能有也可能没有换行符。
允许使用 Windows 行尾 (CR/LF),即使在 *nix 托管的 php 上也是如此。
【讨论】:
以上是关于openssl_verify():提供的密钥参数不能被强制转换为 .pem 文件的公钥的主要内容,如果未能解决你的问题,请参考以下文章
为啥 openssl_verify() 无法验证我的 JWT 令牌签名?
使用 php-jwt 库解码 firebase 自定义令牌时出现 openssl_verify() 错误