Разбор нового формата openssh-key-v1 с использованием openssl libcrypto - PullRequest
0 голосов
/ 20 марта 2019

Мне нужно проанализировать закрытый ключ SSH ~/.ssh/id_rsa с openssl (libcrypto) в ключ EVP_PKEY* или RSA*.До недавнего времени этот файл хранился в стандартном формате PEM или PKCS1, который легко анализировать.Однако openssh перешел на новый, более сложный формат.

Структура определена здесь и закодирована в PEM, она выглядит так (генерируется с помощью ssh-keygen)

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABAnG3jyNb
SKSG19wHPhx2U1AAAAEAAAAAEAAAEXAAAAB3NzaC1yc2EAAAADAQABAAABAQDtmnNl2AFg
9faMuZ/U38tY3+pDrOa2yoiOLeXQI3044xNiMiGrRW03wzWsaNCcI8ZnEeSvzr2HUq0YFQ
QQ6MaQp8cZmoGkOSnwhLAscocZOaoZwoj85w2hybuSy9fc99FqKbJ201a0++2BhTw4Syhs
LT3AOs+Z0hHXZEVWAfBsOd4icLnChBdEAsIBzEObdGsZXHiOcVgvcbJ7UOuQCkiJV3RX+P
IvTzivPQ8IGmsgYUj5KSPjZg03/tr3ePItuFQZH2p85dQlbOLyhtMpx6M5ErCAesxuTN6z
kHKtfRNfYXoDOgd5EBIc9hLnmQtpn2EjfIk+yW+yTiv0pwNUhoeFAAAD0BHcM21NrYK7Pu
C4m79CfD3ZRMdKzG+hUqrV6bRC8qK/iTnt/E4GvEOIOqqoQMQp7PLRP5CkeWRp4Y0nmpsP
zoSlVLvpJ1o36pSSpF6ClmsviAXjujB4wqOp+vq9KqfQfJT+khq4u2EaKwzclpfwaUe2lT
t/UdUok4n8BGVZl6Hw3vF+a8XWpM3ZWxFJXNaQ1bklfYraKDR483I2KJX/hT1Y+Shrl7hd
faqfI8A71lV7qYwqyEMBgwsbNzDYUpICwAEGp00pbX7ahBgo3OIL8Ay1LTbVRyZqMZGGSy
Ay4+WD5cgzU1sb7Z7XnKeRdEWyYUezvzDLpwYsx5RjXIDECBOwbRexh0X0taJw9MIS1YtV
dXz+8PRelQSn7jMHTLa1ILhF95KQBBnqN8EAZEXPnX50b6tz1y7/U1PR/+OxaEGX960m25
2WoXfSRraA6lA2b28r4NT2/BWfYg+6RVu9AQOwdZNWs1fU4ZwnN3yf2w+xEJvvnrXFJrIv
Hy6riJOIB9kSFI314vqmipsMpm7eJK7S3TCi8O6npfkhKTsU1rK4MW+gYp3LKTa2/eUy9r
Rfdgg3dZfq4e51th/9g6SCfrLaDhqTVf7AThOSlmqIpW2A1+4WmuSqhplZhZV5QA0Dyg26
mPHMFTIKs6P2dzgqTkfFxpEici6BeTiSBuMjeKau2HI8r6VD8fcpkvcARPHncoZAdQbars
+e9FhyNMY+EVzun95FUjlbSAFCjGUN81/XPAd+PERTtg+Z1h+QEb1jlZO6l+L62SYXZQO7
jZa3euvFTUxh4GAuWMF4SM7HibTrnY3POD4y8pIWWFsS6xbDQPcy1BdgS4A4IeAXNFbFsX
U7xAwiA0QOnF2Qwc6rTIfR8KiDJ2pMPuSF3CsvuX1VuJZ4EvUFXImBAmet5ChXA2Gw2Gkf
vItgB70xjRVJUjqOE1FE8Qb61BWEvH9pQMIHt59ldrcnLycOFmBIvWiCLyEb5s+asMsqui
GoMowxdmaM+tkNsJIWFqKviaqHL51ZxzWfZ5C8RIrC1bBjCPdHd+T6iQifNS1vJhgEPuG/
iI9R2aFMdz69CVnWJzhtTEvJFsBNiM1rKTXXFm00rCZozKM6xVaiDodgL5s3FxVr17WTMH
FaFMCH7JNAJMCR7080IuABHFubE2UyeCV6WxUgDpeGzLGOLXmLlrpyB5DHbkuNa8OohIDm
qW5yZcK4RoN1Foi4+tAs7qCJQAJBKFmwTc+5y6mQnq9s9jHQqBbyweHmK8VTHwiRpHbBv/
BQ3FL3t8pTZxv6msYq0+PUUZ3L8+k=
-----END OPENSSH PRIVATE KEY-----

Первым шагом является синтаксический анализ текста с помощью PEM_read_bio, который удалит заголовок PEM и декодирует base64 данные.Но неясно, как отделить структуру от спецификации.

Первые 15 байтов зафиксированы как openssh-key-v1\0, но оттуда неясно.

1 Ответ

0 голосов
/ 25 мая 2019

Самый простой способ разобрать их - это не разбирать их самостоятельно, а вместо этого использовать ssh-keygen -p -m PEM -f ~/.ssh/id_rsa, чтобы преобразовать ключ в формат PEM, а затем проанализировать его, используя OpenSSL, как обычно.

Если у вас естьсерьезное желание испачкать руки, однако, описание протокола, на которое вы ссылаетесь, фактически дает вам большинство того, что вам нужно знать.(Важные) части недостающей информации:

  • Все целые числа имеют сетевой порядок байтов;
  • int - это 32 бита;
  • Наиболее важно, string тип - это кортеж со значением длины, где length - это uint32, указывающий, сколько следующих октетов составляют строку;и
  • Форматы различных типов открытых ключей (ssh-dss, ssh-rsa, ecdsa-sha2-* и т. д.) задокументированы в различных RFC, которые вы можете найти в реестре IANA для SSH Public.Имена ключевых алгоритмов .

Экстраполяция частей закрытых ключей различных типов ключей оставлена ​​в качестве упражнения для читателя, потому что я еще не понял этого.В ближайшем будущем мой openssl-adds gem будет иметь реализацию Ruby SSH на основе Ruby, потому что мне нужно выяснить это для моего собственного проекта, поэтомуиз этого вы можете взять порядок параметров.

...