【发布时间】:2025-12-02 01:10:02
【问题描述】:
我正在尝试在 PHP 中使用 OpenSSL 函数进行 RSA 签名/验证。
当我尝试使用我的公钥执行 openssl_verify 时,我收到此错误:error:0906D06C:PEM routines:PEM_read_bio:no start line,但函数本身可以正常工作(如果消息被修改,则返回 0 , 如果完整则为 1)。 openssl_sign 工作正常。
我该如何解决?
目前,我使用openssl生成的公钥:
define("SC_MSG_PUBLIC", <<<EOD
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALjPcOckMHDVLiUstcRwwx8kF5PzsiEs
rskyndWisbXMLU9BHomXwL7Qg2L91jE+sNSobkzBDF41CbwDiNlofZUCAwEAAQ==
-----END PUBLIC KEY-----
EOD
);
知道为什么会触发此错误,但一切正常吗?
试图从私钥生成公钥并使用它,但它似乎完全相同,相同的错误消息:-S
$pkey = openssl_pkey_get_private(SC_MSG_PRIVATE);
$keyDetails = openssl_pkey_get_details($pkey);
file_put_contents('c:\publickey', $keyDetails['key']);
另外,我尝试安装所有新版本(PHP 5.3.1、OpenSSL 1.0.0a)——结果相同。而且,我在 Windows 上。
【问题讨论】:
-
您必须在封装边界处保留 CR/LF(
-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----)。请注意,这是一个 CR/LF 对;而不是 CR (OS X) 而不是 LF (Linux)。没有它们,OpenSSL 无法解析 PEM。您还需要确保一行的长度小于 1000 个字符。另请参阅RFC 1421, Section 4.3.1, Constraints。