Я использовал ключи RSA с в моем приложении. Я использовал следующий код для преобразования ключа RSA из OpenSSL в формат OpenSSH. Он отлично работал для ключа RSA. Теперь я хочу поддерживать ключи DSA. Но мой код преобразования не работает для ключей DSA. Какая модификация мне нужна, чтобы она работала с ключами DSA?
$private_key = openssl_pkey_get_private($rsaKey);
$public_key = sshEncodePublicKey($private_key);
echo "RSA public key in OpenSSH format:\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);
}
Определение ключа dsa принципиально отличается от определения ключей rsa. Не существует «экспоненты» (номера, к которому вы обращаетесь $keyInfo['rsa']['e']
и нет n
,
Поскольку ваш код анализирует ключ и повторно его кодирует, это не удастся с ключами dsa. Вместо, openssl_pkey_get_details
дает вам совершенно другой массив элементов, как указано в руководство.
Чтобы преобразовать это, используйте следующий код:
function sshEncodePublicKey($privKey)
{
$keyInfo = openssl_pkey_get_details($privKey);
$buffer = pack("N", 7) . "ssh-dss" .
sshEncodeBuffer($keyInfo['dsa']['p']) .
sshEncodeBuffer($keyInfo['dsa']['q']) .
sshEncodeBuffer($keyInfo['dsa']['g']) .
sshEncodeBuffer($keyInfo['dsa']['pub_key']);
return "ssh-dss " . base64_encode($buffer);
}
Конечно, ваш код должен решить, какой это тип ключа, но я думаю, что могу оставить это вам.
Также обратите внимание, что PHP имеет функцию openssl_pkey_get_public, который более подходит. Я использовал это для проверки приведенного выше кода (я просто заменил ваши первые 4 строки на $public_key = sshEncodePublicKey(openssl_pkey_get_public('file://ssl.pub'));
Других решений пока нет …