我一直在嘗試使用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的。
這裏是我的代碼的簡化版本:
// 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-凱基?
2011-04-02
shevron