Php openssl_pkey_get_private返回false

Php openssl_pkey_get_private返回false,php,openssl,Php,Openssl,我试图验证一些私钥,但是php方法openssl\u pkey\u get\u private()总是返回false。 并且openssl\u错误\u字符串()正在返回: 错误:0906D06C:PEM例程:PEM_read_bio:无起始行 $return = openssl_pkey_get_private($path.'_priKEY.pem'); if ($return === false) { var_dump(openssl_error_string(

我试图验证一些私钥,但是php方法openssl\u pkey\u get\u private()总是返回false。 并且openssl\u错误\u字符串()正在返回:

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

    $return = openssl_pkey_get_private($path.'_priKEY.pem');
    if ($return === false) {
        var_dump(openssl_error_string());
    }
$keyfile="file://".__DIR__.DIRECTORY_SEPARATOR."key.pem"; //absolute path
$key = openssl_pkey_get_private($keyfile);

if ($key === false) {
    var_dump(openssl_error_string());
}else{
    var_dump($key);
}
尝试使用从.pfx文件提取的私钥、从.p12文件提取的私钥,甚至是自生成的密钥(使用openssl)。 已尝试使用“RSA私钥”、“加密私钥”和“私钥”。没有什么变化

私钥内容:

-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0B
[......................]
Wxdadnf7MB7DicckIZTKVy1L
-----END PRIVATE KEY-----

看起来您没有为文件路径提供正确的格式。确保它以
file://
开头,后跟和绝对或相对路径。是的,如果选择绝对路径,则文件名的路径类似于
file:///absolute/path/to/keyfile.pem
,从三个斜杠开始。对于相对路径,它将是
file://relative/path/to/keyfile.pem

根据,可以将密钥作为文件路径或包含实际密钥的字符串提供。仅当该值以
file://
开头时,才会将其解释为文件的路径(URI)。否则,该值将被解释为包含PEM编码密钥的字符串。在后一种情况下,它需要一个识别为PEM的起始行,如
---BEGIN PRIVATE KEY-----
。这就是为什么您会收到错误消息,您的参数既不是以
file://
开头,也不是以PEM开始行开头

如果您不喜欢
文件://
路径格式,在将文件提供给
openssl\u pkey\u get\u private()
之前,您可以自己读取文件的内容,例如:

$return = openssl_pkey_get_private(file_get_contents($path.'_priKEY.pem'));

请参考下一个网址

为了缩小您的问题范围,请对php文件和密钥文件使用相同的目录,并尝试使用此工作代码

工作代码

    $return = openssl_pkey_get_private($path.'_priKEY.pem');
    if ($return === false) {
        var_dump(openssl_error_string());
    }
$keyfile="file://".__DIR__.DIRECTORY_SEPARATOR."key.pem"; //absolute path
$key = openssl_pkey_get_private($keyfile);

if ($key === false) {
    var_dump(openssl_error_string());
}else{
    var_dump($key);
}
另请参阅

此.pem文件受密码保护吗?不,我不使用密码。它对我来说适用,适用于PKCS#1和PKCS#8格式的RSA密钥。
$path
变量的确切内容是什么?谢谢,这非常好用!问题在于路径,我使用的是绝对路径,但开头没有“file::/”。此外,传递内容也很有效。@BigBoss我很高兴并祝您在OpenSSL方面取得成功。@Reinier Torenbeek您好,我有确切的PEMK格式------开始私钥------AO5WYGNGGJNALCBJYFPGSHODX8VUTV64W1KCIAEPRMVKGBRJ1UO9D3DPI4VDYT5 5jG9ETWPydZ9UyXMdsVvB0w=----结束私钥------我仍然得到错误。我的代码是$PrivateKey=openssl\u pkey\u get\u private($Pem)$Pem包含上述字符串。你能帮忙吗。