openssl_verify和"错误:0906D06C:PEM例程:PEM_read_bio:无起始行"

Bar*_*ter 12 php ssl openssl

我试图在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
);
Run Code Online (Sandbox Code Playgroud)

任何想法为什么这个错误触发,但事情工作正常?

尝试从私有生成公钥,并使用它,但它似乎完全相同,相同的错误消息:-S

$pkey = openssl_pkey_get_private(SC_MSG_PRIVATE);
$keyDetails = openssl_pkey_get_details($pkey);
file_put_contents('c:\publickey', $keyDetails['key']);
Run Code Online (Sandbox Code Playgroud)

此外,我已经尝试安装所有新版本(PHP 5.3.1,OpenSSL 1.0.0a) - 结果相同.而且,我在窗户上.

Arc*_*dix 15

您是否尝试使用包含公钥而不是纯公钥的(可能是自签名)证书来调用openssl_verify()

据我所知,一些PHP OpenSSL函数不能正确支持裸公钥,尽管尽管出现错误但它确实能够正确验证似乎很奇怪.

<?php
$private = openssl_pkey_get_private(file_get_contents('private'), 'passphrase');

// This causes the "no start line" error when using a naked public key:
$public  = openssl_pkey_get_public(file_get_contents('public')); // <-- this should be cert

echo openssl_error_string()."\n";

openssl_sign('Test', $sig, $private);
var_dump(openssl_verify('Test', $sig, $public));

echo openssl_error_string()."\n";
?>
Run Code Online (Sandbox Code Playgroud)

将公钥转换为Linux/UNIX shell(如bash)中的简单证书的示例(有关更多信息,请参阅OpenSSL文档或一些教程):

# Create certificate request
openssl req -new -days 3600 -key [PRIVATE-KEY-FILE] -out [REQUEST-TMP-FILE]

# Create certificate from request
RANDFILE=[RANDOM-TMP-FILE] openssl x509 -req -in [REQUEST-TMP-FILE] -signkey [PRIVATE-KEY-FILE] -out [CERTIFICATE-OUT-FILE]
Run Code Online (Sandbox Code Playgroud)

这也将创建您之后可能要删除的临时文件,即[REQUEST-TMP-FILE][RANDOM-TMP-FILE].

PHP示例代码可以在http://de.php.net/manual/en/function.openssl-csr-new.php找到.