Сгенерировать закрытый SSH-ключ RSA в PHP


Я сгенерировал SSH-ключ с помощью PHP OpenSSL:

$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 и Реализация PHP OpenSSL?

Author: jww, 2016-04-19

1 answers

Итак, это два разных типа ключей. Вы ищете PKCS #1, но получаете PKCS #8.

Похоже, это связано с версией OpenSSL, которую использует PHP. Версии начиная с 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"];
?>
 5
Author: miken32, 2017-05-23 11:58:56