Я хочу сгенерировать ssh keypair от php. Кто-нибудь может мне посоветовать, как это сделать? Я пробовал shell_exec, но оболочка задает вопросы, так что команда не работает. Я хотел бы указать имя файла и путь для ввода ключей после генерации.
Я бы использовал phpseclib, чистую реализацию PHP RSA :
<?php include('Crypt/RSA.php'); $rsa = new Crypt_RSA(); $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_OPENSSH); extract($rsa->createKey()); echo "$publickey\r\n\r\n$privatekey"; ?>
Пример вывода:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZw== phpseclib-generated-key -----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUp wmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ5 1s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQABAoGAFijko56+qGyN8M0RVyaRAXz++xTqHBLh 3tx4VgMtrQ+WEgCjhoTwo23KMBAuJGSYnRmoBZM3lMfTKevIkAidPExvYCdm5dYq3XToLkkLv5L2 pIIVOFMDG+KESnAFV7l2c+cnzRMW0+b6f8mR1CJzZuxVLL6Q02fvLi55/mbSYxECQQDeAw6fiIQX GukBI4eMZZt4nscy2o12KyYner3VpoeE+Np2q+Z3pvAMd/aNzQ/W9WaI+NRfcxUJrmfPwIGm63il AkEAxCL5HQb2bQr4ByorcMWm/hEP2MZzROV73yF41hPsRC9m66KrheO9HPTJuo3/9s5p+sqGxOlF L0NDt4SkosjgGwJAFklyR1uZ/wPJjj611cdBcztlPdqoxssQGnh85BzCj/u3WqBpE2vjvyyvyI5k X6zk7S0ljKtt2jny2+00VsBerQJBAJGC1Mg5Oydo5NwD6BiROrPxGo2bpTbu/fhrT8ebHkTz2epl U9VQQSQzY1oZMVX8i1m5WUTLPz2yLJIBQVdXqhMCQBGoiuSoSjafUhV7i1cEGpb88h5NBYZzWXGZ 37sJ5QsW+sJyoNde3xH8vdXhzU7eT82D6X/scw9RZz+/6rCJ4p0= -----END RSA PRIVATE KEY-----
Источник: http://phpseclib.sourceforge.net/rsa/examples.html#openssh
Это основано на преобразовании открытого ключа OpenSSL открытого ключа RSA в формат OpenSSH (PHP) . Спасибо, шеврон .
<?php $rsaKey = openssl_pkey_new(array( 'private_key_bits' => 1024, 'private_key_type' => OPENSSL_KEYTYPE_RSA)); $privKey = openssl_pkey_get_private($rsaKey); openssl_pkey_export($privKey, $pem); //Private Key $pubKey = sshEncodePublicKey($rsaKey); //Public Key $umask = umask(0066); file_put_contents('/tmp/test.rsa', $pem); //save private key into file file_put_contents('/tmp/test.rsa.pub', $pubKey); //save public key into file print "Private Key:\n $pem \n\n"; echo "Public key:\n$pubKey\n\n"; function sshEncodePublicKey($privKey) { $keyInfo = openssl_pkey_get_details($privKey); $buffer = pack("N", 7) . "ssh-rsa" . sshEncodeBuffer($keyInfo['rsa']['e']) . sshEncodeBuffer($keyInfo['rsa']['n']); return "ssh-rsa " . base64_encode($buffer); } function sshEncodeBuffer($buffer) { $len = strlen($buffer); if (ord($buffer[0]) & 0x80) { $len++; $buffer = "\x00" . $buffer; } return pack("Na*", $len, $buffer); } ?>
Кто-нибудь пробовал это?
ssh-keygen -q -N place_your_passphrase_here -t rsa -f ~/.ssh/id_rsa
Это сработало для меня
Проверьте man-страницу ssh-keygen
чтобы узнать, как ее выполнить без каких-либо подсказок.