尝试通过简单的方式加载我的私钥时出现以下错误。这是我的代码。
public function loadPrivateKey($fileName, $password = null){
if(!is_file($fileName))
throw new SignException('Private key not found', SignException::KEY_NOT_FOUND);
$fileContent = file_get_contents($fileName);
if(!is_null($password))
$this->prvKey = openssl_get_privatekey($fileContent, $password);
else
$this->prvKey = openssl_get_privatekey($fileContent);
if(!empty(openssl_error_string()))
throw new SignException('OpenSSL Error: '.openssl_error_string());
if(!is_resource($this->prvKey))
throw new SignException('Private key is not resourse', SignException::EXTERNAL_ERROR);
}
openssl_error_string()
返回error:2006D002:BIO routines:BIO_new_file:system lib
。
我使用php.ini
在extension=php_openssl.dll
中启用了OpenSSL。
可能是什么问题?我该如何解决?
谢谢!
答案 0 :(得分:0)
函数openssl_get_privatekey()
是openssl_pkey_get_private()
的别名。这个函数有两个参数;第一个是URI格式的文件名,或者是PEM格式的私钥的内容。第二个是密码短语。
您收到的错误表示尝试读取文件时出错;通常,相关文件为included in the error message,因此您可能只在此处包含部分错误。由于您没有使用OpenSSL读取文件,最可能的罪魁祸首是OpenSSL配置文件;需要告诉系统在哪里寻找它。
环境变量也可以从within your PHP code设置,但需要将其添加到您的所有代码中,因此可能不是优选的。另外,如上所述,您可以直接从函数调用中打开密钥文件;这是我建议的尝试:
<?php
public function loadPrivateKey($fileName, $password = "") {
// I just used the value from my system here
putenv("OPENSSL_CONF=C:\\OpenSSL\\bin\\openssl.cfg");
if (!is_readable($fileName)) {
throw new SignException("Private key not found or not readable", SignException::KEY_NOT_FOUND);
}
$fileName = "file://$fileName";
$this->prvKey = openssl_get_privatekey($fileName, $password);
if (!empty(openssl_error_string())) {
throw new SignException("OpenSSL error: " . openssl_error_string());
}
if (!is_resource($this->prvKey)) {
throw new SignException("Private key is not resource", SignException::EXTERNAL_ERROR);
}
}