Estou tendo problemas para analisar um arquivo de chave pública OpenSSH. Acredito (mas não tenho certeza) que o formato está detalhado no RFC 4253, Seção 6.6 do protocolo da camada de transporte Secure Shell (SSH) , Algoritmos de chave pública.
No caso de uma chave RSA, o RFC diz:
O formato de chave "ssh-rsa" tem a seguinte codificação específica:
string "ssh-rsa" mpint e mpint n
Aqui, os parâmetros 'e' e 'n' formam o blob de chave de assinatura.
Aqui é onde os problemas começam. O documento não fornece uma gramática e não define o que string
e mpint
são. O que leva a:
$ cat rsa.ssh.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDSNM6RVVmwN3y0NurIQnmZgjcx5K5zzZu9nDqopW4J
In/mr8OYZI3heSJShnIM8EThvwVGXXXyyJVRQAvRHYFO4DxS6bufSNWr3BxBGaGYlYxI9mgvQnT6+MzE
3oZyEMdQNPlV5VfbileXlrPoAk1TkGdVdhwdLJMI2B4KUyMf+Q== jwalton@test
E depois:
$ echo 'AAAAB3NzaC1yc2EAAAADAQABAAAAgQDSNM6RVVmwN3y0NurIQnmZgjcx5K5zzZu9nDqopW4
JIn/mr8OYZI3heSJShnIM8EThvwVGXXXyyJVRQAvRHYFO4DxS6bufSNWr3BxBGaGYlYxI9mgvQnT6+M
zE3oZyEMdQNPlV5VfbileXlrPoAk1TkGdVdhwdLJMI2B4KUyMf+Q==' | base64 -d > rsa.bin
E finalmente:
$ hexdump -C rsa.bin
00000000 00 00 00 07 73 73 68 2d 72 73 61 00 00 00 03 01 |....ssh-rsa.....|
00000010 00 01 00 00 00 81 00 d2 34 ce 91 55 59 b0 37 7c |........4..UY.7||
00000020 b4 36 ea c8 42 79 99 82 37 31 e4 ae 73 cd 9b bd |.6..By..71..s...|
00000030 9c 3a a8 a5 6e 09 22 7f e6 af c3 98 64 8d e1 79 |.:..n.".....d..y|
00000040 22 52 86 72 0c f0 44 e1 bf 05 46 5d 75 f2 c8 95 |"R.r..D...F]u...|
00000050 51 40 0b d1 1d 81 4e e0 3c 52 e9 bb 9f 48 d5 ab |[email protected].<R...H..|
00000060 dc 1c 41 19 a1 98 95 8c 48 f6 68 2f 42 74 fa f8 |..A.....H.h/Bt..|
00000070 cc c4 de 86 72 10 c7 50 34 f9 55 e5 57 db 8a 57 |....r..P4.U.W..W|
00000080 97 96 b3 e8 02 4d 53 90 67 55 76 1c 1d 2c 93 08 |.....MS.gUv..,..|
00000090 d8 1e 0a 53 23 1f f9 |...S#..|
00000097
Portanto, parece haver campos não documentados no arquivo de chave pública. A RFC não parece se referir a outros documentos para as definições dos campos. O RFC também não documenta o arquivo de chave privada. Estou parado no momento.
Onde o OpenSSH define os campos usados em seus arquivos de chave?
Eles são definidos no RFC 4251 "The Secure Shell (SSH) Protocol Architecture", seção 5 .
O protocolo SSH não documenta nenhum formato de arquivo . Ele apenas define a serialização de chaves públicas quando elas são enviadas como parte do protocolo SSH (por exemplo, quando um cliente envia SSH_MSG_USERAUTH para oferecer sua chave pública).
Portanto, como a chave privada nunca é enviada pela rede como parte do protocolo SSH, sua serialização também não precisa fazer parte da especificação – apenas as assinaturas feitas por essa chave precisam ter um formato definido.
Para chaves públicas, o OpenSSH provavelmente optou por reutilizar o mesmo formato RFC 4253 para armazená-las em arquivos porque é a opção mais conveniente (ou seja, já possui o código de serialização de qualquer maneira). Não é necessário fazer isso por especificação e, de fato, a maioria dos outros clientes tem seus próprios formatos.
Como o OpenSSH usa o OpenSSL para o código criptográfico (algoritmos, geração de chaves), as versões anteriores do OpenSSH simplesmente armazenavam chaves privadas usando qualquer formato que as funções do OpenSSL ofereciam - que era o formato PKCS#1 'RSAPrivateKey' serializado por DER (também conhecido como formato PEM ) a maior parte do tempo. Veja RFC 3447 para a definição ASN.1 do formato.
(O próprio OpenSSL agora prefere armazenar chaves privadas no formato PKCS#8, o que significa que o OpenSSH também pode carregar essas chaves, embora não as grave. Consulte RFC 5208 para a definição ASN.1 do formato do contêiner.)
Você pode reconhecer o formato PKCS#1 pelo cabeçalho "BEGIN RSA PRIVATE KEY" e PKCS#8 pelo cabeçalho "BEGIN PRIVATE KEY". Você pode usar
dumpasn1
ouopenssl asn1parse
para investigar seu conteúdo, bem comoopenssl rsa
eopenssl pkey
.Versões recentes do OpenSSH inventaram um novo formato personalizado para arquivos de chave privada. O formato do contêiner está documentado em PROTOCOL.key , e os formatos de chave individuais são [provavelmente?] os mesmos usados por ssh-agent , que está documentado em draft-miller-ssh-agent . Este formato usa os tipos de dados RFC 4251.
Outros softwares SSH geralmente têm formatos diferentes. Por exemplo, o PuTTY usa o formato "PPK" (que está documentado em algum lugar, eu me lembro, mas estranhamente não consigo encontrar onde) para armazenar chaves públicas e privadas. Seu
Public-Lines
campo armazena a mesma chave pública RFC 4253, enquanto os campos privados são personalizados.Há também o RFC 4716 , que afirma ser " O formato de chave pública SSH", mas geralmente não é considerado parte integrante do SSH. (SSH.COM, SecureCRT e provavelmente MultiNet SSH usam esse formato.)