在PHP中生成RSA私钥SSH密钥

4

我使用PHP OpenSSL生成了一个SSH密钥:

$rsaKey = openssl_pkey_new(array( 
    'private_key_bits' => 4096,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
));
$privKey = openssl_pkey_get_private($rsaKey); 
openssl_pkey_export($privKey, $pem);

这导致$pem代码如下所示:
-----BEGIN PRIVATE KEY-----
MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQC8ggt6rVHYnqNP
...
e95+EXbPc6THyWt9pgwOsJltpylIYG4=
-----END PRIVATE KEY-----
但是我不能使用此密钥进行身份验证。在使用它之前,我必须使用以下命令进行转换:
openssl rsa -in xxx.key -outform pem > xxx.key2

转换的结果如下:
-----BEGIN RSA PRIVATE KEY-----
MIIJKQIBAAKCAgEAvIILeq1R2J6jT+xjlK5NrOqFZTOJ4PByvgPQNbb2Kp7c3W15
...
o1t2KBkaSoR+JyOPOZakq5BLv8lgD3vefhF2z3Okx8lrfaYMDrCZbacpSGBu
-----END RSA PRIVATE KEY-----
两者都是PEM格式,但第二个是RSA私钥。使用第二个,PHP可以登录。因此,我需要一个以“RSA PRIVATE KEY”开头的密钥,而不仅仅是“PRIVATE KEY”。如何使用PHP和OpenSSL PHP实现创建这个密钥?

你知道这些被称为“私钥”的东西有原因吧?你肯定会想要丢掉它。 - Sammitch
3
看起来这与版本有关。在 PHP 5.5.31 上运行,我得到 BEGIN RSA PRIVATE KEY,但在 PHP 7.0.4 上运行,我得到 BEGIN PRIVATE KEY。这可能也与它所编译的 OpenSSL 版本有关。 - miken32
这是一个很好的问题。关于@miken32刚才的评论,我正在通过CLI运行PHP 5.5.30,并且我得到了“私钥”。运行openssl rsa -in myKey.pem -check会显示“RSA密钥ok”,然后将其转换为您期望看到的内容。文档具有误导性,因为它表明您正在执行的操作应该导致RSA密钥(在两端的注释中明显可见)。 - scrowler
@RichardReiber 我刚刚更新到1.0.2g,对我来说没有任何变化。 - scrowler
@RobbieAverill:我也是。在我的本地机器上,PHP 5.6上有“OpenSSL 0.9.8zh”。 - Richard
显示剩余2条评论
1个回答

6

所以,这些是两种不同的密钥类型。你正在寻找PKCS#1,但得到了PKCS#8。

这似乎与PHP使用的OpenSSL版本有关。自1.0版本以来,创建PKCS#8文件,并且PHP开发人员无法解决此问题。在使用以下命令行时也会出现相同的问题:

openssl req -new -keyout mykey.key -out mycertreq.csr -nodes -sha1 -newkey rsa:2048

你可以尝试使用一个叫做phpseclib的外部库,虽然我自己没有尝试过:
<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_OPENSSH);
$result = $rsa->createKey();
echo $result["privatekey"];
?>

我已经看到过这个了,而且对“PHP 4”感到担忧。我刚刚检查了Github存储库,它并不像我之前想象的那么过时。如果我找不到另一个带有其他OpenSSL版本的解决方案,我会尝试使用它。 - Richard
1
是的,我会更新链接,因为我认为Sourceforge上的链接已经过时了! - miken32

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接