我一直在尝试使用PHP的openssl扩展生成RSA密钥对,并将结果保存为OpenSSH兼容密钥对 - 意味着私钥是PEM编码(很简单)和公共密钥存储在以下形式的OpenSSH的特定格式:将OpenSSL生成的RSA公钥转换为OpenSSH格式(PHP)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABA...more base64 encoded stuff...
至于我可以收集这些格式包括:
- 关键型清晰文字,后面跟空格(即“openssh-rsa”)
- 表示以下数据A base64编码串:(在此情况下7)编码为32比特的无符号长大端
- 算法名称,在这种情况下“
- 算法名称的字节长度SSH- RSA E”
- 的RSA的长度‘’中的字节数,被编码为32位无符号长大端
- 的RSA‘e’的数量
- 的RSA的长度‘N’数以字节为单位的编码作为32位无符号长大端编号
- RSA'n'编号
我尝试实施这一使用PHP的包()函数,但无论我怎么努力的结果绝不会是相当于什么,我从使用上所产生的同RSA私钥的ssh-keygen -y -f
命令得到OpenSSL的。
这里是我的代码的简化版本:
<?php
// generate private key
$privKey = openssl_pkey_new(array(
'private_key_bits' => 1024,
'private_key_type' => OPENSSL_KEYTYPE_RSA
));
// convert public key to OpenSSH format
$keyInfo = openssl_pkey_get_details($privKey);
$data = pack("Na*", 7, 'ssh-rsa');
$data .= pack("Na*", strlen($keyInfo['rsa']['e']), $keyInfo['rsa']['e']);
$data .= pack("Na*", strlen($keyInfo['rsa']['n']), $keyInfo['rsa']['n']);
$pubKey = "ssh-rsa " . base64_encode($data);
echo "PHP generated RSA public key:\n$pubKey\n\n";
// For comparison, generate public key using ssh-keygen
openssl_pkey_export($privKey, $pem);
$umask = umask(0066); // this is needed for ssh-keygen to work properly
file_put_contents('/tmp/ssh-keygen-test', $pem);
umask($umask);
exec('ssh-keygen -y -f /tmp/ssh-keygen-test', $out, $ret);
$otherPubKey = $out[0];
echo "ssh-keygen generated RSA public key:\n$otherPubKey\n\n";
echo ($pubKey == $otherPubKey ? "yes! they are the same\n" : "FAIL! they are different\n");
?>
我如何能做到这一点的任何提示,而不依赖于SSH-凯基?
请注意'sshEncodeBuffer'需要字节长度。如果你有'mbstring。func_overload'设置为重载字符串函数,用'mb_strlen($ buffer,'8bit')替换'strlen($ buffer)';' – bishop 2016-02-17 16:02:29
@shevron它完美适用于RSA密钥。但它不适用于DSA密钥。我如何转换DSA公钥? – Harikrishnan 2016-06-03 04:42:54