在PHP中生成RSA私有SSH密钥

时间:2016-04-18 21:15:43

标签: php ssh openssl rsa private-key

我已经使用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实现创建它?

1 个答案:

答案 0 :(得分:5)

所以,这些是two different key types。您正在寻找PKCS#1,但正在寻找PKCS#8。

这似乎与PHP使用的OpenSSL版本有关。自1.0版以来的版本创建了一个PKCS#8文件,并且nothing the PHP developers想要解决它。使用此命令从命令行执行此操作时会出现同样的问题:

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"];
?>