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() 错误

openssl_verify 和“错误:0906D06C:PEM 例程:PEM_read_bio:没有起始行”

提供的密钥参数不能强制转换为私钥

调用 API:如何提供这些参数(密钥、随机数和签名)

ssh-keygen常用参数详解