openssl_pkey_get_public 返回 false,但密钥确实存在
openssl_pkey_get_public returning false, but key does exist
我正在使用一个使用 openssl_pkey_get_public 的库,但它返回 false。似乎启用了openssl,并且密钥存在。下面是我正在使用的库中的几行,顺便说一句,我正在调试但不能修改,因为它不是我的代码库:
protected function decrypt($encryptedData)
{
$publicKey = openssl_pkey_get_public($this->publicKey->getKeyPath());
$publicKeyDetails = @openssl_pkey_get_details($publicKey);
if ($publicKeyDetails === null) {
throw new \LogicException(
sprintf('Could not get details of public key: %s', $this->publicKey->getKeyPath())
);
}
.
.
.
我插入了以下调试代码:
$keyPath = $this->publicKey->getKeyPath(); // returns file:///var/www/sso/website/storage/id_rsa.pub
var_dump(file_exists($keyPath)); // outputs true
var_dump(openssl_pkey_get_public($keyPath)); // returns false
$keyPath 的内容如下:
echo file_get_content($keyPath);
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQChY1gtF0Oeku62+4HCisIswcDu9fjZV7fImTlqQej/UsmsJH7jz5EF/ZXCWTKV/bgOwzV2oeHomukITqiR14D01W3mVcpTBAp5AP4JN25am57xdc6Nxd8Lo/NsCKKqQ4/uBmpYBVZm8Ye/hu3ixM6y/xbCGnw/ca4z0DKDa94z1XrRc6FrV1mXx5lItQEo/v8wVKX9NJVAANYZ/jJEk7jGTB9WkSTNR5l/tNBBF3MFuBigjSuaxUsnKT2IwOV5g2ewN4TzXARi2/BI7rweNsUFCWRbkUa7VJc3XOVZbS50TzUpAIqHI9Q8enBs95A1JvSTDvlT3efEHrM2T7KP7QOz ubuntu@ubuntu-xenial
我之前使用以下命令创建了密钥:
ssh-keygen -f storage/id_rsa -t rsa -N ''
如果有帮助,请补充一些信息:
$ php -i | grep openssl
openssl
Openssl default config => /usr/lib/ssl/openssl.cnf
openssl.cafile => no value => no value
openssl.capath => no value => no value
$ php -m | grep openssl
openssl
发生这种情况有什么原因吗?
您正在使用 SSH 格式的 public 密钥。 OpenSSL 不支持该格式。但是你知道什么支持这种格式吗? php安全库。它将 auto-detect 格式,一旦加载,将让您执行您需要执行的任何 RSA 操作。请注意,phpseclib 期望将实际密钥传递给它 - 不是文件系统上密钥的路径,而是密钥本身。
示例代码:http://phpseclib.sourceforge.net/rsa/examples.html#encrypt,enc
$pub_key = openssl_pkey_get_public("-----BEGIN PUBLIC KEY-----\n".file_get_contents('public_key.pem')."\n-----END PUBLIC KEY-----");
var_dump($pub_key);
我正在使用一个使用 openssl_pkey_get_public 的库,但它返回 false。似乎启用了openssl,并且密钥存在。下面是我正在使用的库中的几行,顺便说一句,我正在调试但不能修改,因为它不是我的代码库:
protected function decrypt($encryptedData)
{
$publicKey = openssl_pkey_get_public($this->publicKey->getKeyPath());
$publicKeyDetails = @openssl_pkey_get_details($publicKey);
if ($publicKeyDetails === null) {
throw new \LogicException(
sprintf('Could not get details of public key: %s', $this->publicKey->getKeyPath())
);
}
.
.
.
我插入了以下调试代码:
$keyPath = $this->publicKey->getKeyPath(); // returns file:///var/www/sso/website/storage/id_rsa.pub
var_dump(file_exists($keyPath)); // outputs true
var_dump(openssl_pkey_get_public($keyPath)); // returns false
$keyPath 的内容如下:
echo file_get_content($keyPath);
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQChY1gtF0Oeku62+4HCisIswcDu9fjZV7fImTlqQej/UsmsJH7jz5EF/ZXCWTKV/bgOwzV2oeHomukITqiR14D01W3mVcpTBAp5AP4JN25am57xdc6Nxd8Lo/NsCKKqQ4/uBmpYBVZm8Ye/hu3ixM6y/xbCGnw/ca4z0DKDa94z1XrRc6FrV1mXx5lItQEo/v8wVKX9NJVAANYZ/jJEk7jGTB9WkSTNR5l/tNBBF3MFuBigjSuaxUsnKT2IwOV5g2ewN4TzXARi2/BI7rweNsUFCWRbkUa7VJc3XOVZbS50TzUpAIqHI9Q8enBs95A1JvSTDvlT3efEHrM2T7KP7QOz ubuntu@ubuntu-xenial
我之前使用以下命令创建了密钥:
ssh-keygen -f storage/id_rsa -t rsa -N ''
如果有帮助,请补充一些信息:
$ php -i | grep openssl
openssl
Openssl default config => /usr/lib/ssl/openssl.cnf
openssl.cafile => no value => no value
openssl.capath => no value => no value
$ php -m | grep openssl
openssl
发生这种情况有什么原因吗?
您正在使用 SSH 格式的 public 密钥。 OpenSSL 不支持该格式。但是你知道什么支持这种格式吗? php安全库。它将 auto-detect 格式,一旦加载,将让您执行您需要执行的任何 RSA 操作。请注意,phpseclib 期望将实际密钥传递给它 - 不是文件系统上密钥的路径,而是密钥本身。
示例代码:http://phpseclib.sourceforge.net/rsa/examples.html#encrypt,enc
$pub_key = openssl_pkey_get_public("-----BEGIN PUBLIC KEY-----\n".file_get_contents('public_key.pem')."\n-----END PUBLIC KEY-----");
var_dump($pub_key);