Como converto uma chave pública ssh-keygen em um formato que a função openssl PEM_read_bio_RSA_PUBKEY () consuma?

36

Estou com um problema ao gerar uma chave pública que a função openssl PEM_read_bio_RSA_PUBKEY() pode consumir. Eu continuo recebendo erros.

Obviamente, não posso simplesmente usar a string ASCII no arquivo de chaves ssh-keygen <>.pub como está no formato de arquivo SSH ou talvez SubjectPublicKeyInfo structure.

Aqui está o código gen-chave: ssh-keygen -t rsa -b 1024 -C "Test Key"

Eu encontrei um conversor em php na web que irá converter o conteúdo da chave pública em um formato de string Punch ASCII base64. No entanto, a função ainda não gosta disso.

A documentação do Openssl diz:

  1. “Função RSA_PUBKEY () que processa uma chave pública usando uma estrutura EVP_PKEY”
  2. “As funções RSA_PUBKEY também processam uma chave pública RSA usando uma estrutura RSA”

Como obtenho minha chave pública OpenSSH em qualquer formato que a função OpenSSL consuma?

    
por PeteP 15.12.2011 / 22:38

5 respostas

44

OK!

Então eu entrei neste pensamento "Fácil, eu tenho isso." Acontece que há muito mais do que eu pensava.

Portanto, o primeiro problema é que (de acordo com as páginas man do OpenSSL (man 3 pem)), o OpenSSL espera que a chave RSA esteja no formato PKCS # 1. Claramente, isso não é o que o ssh-keygen está trabalhando. Você tem duas opções (de pesquisar ao redor).

Se você tiver o OpenSSH v. 5.6 ou posterior (eu não fiz no meu laptop), você pode executar isto:

ssh-keygen -f key.pub -e -m pem

O método mais longo de fazer isso é separar sua chave SSH em seus vários componentes (o blog entry Eu achei que parte disso acusa o OpenSSH de ser "proprietário", eu prefiro chamá-lo de "único") e então usar um ASN1 biblioteca para trocar as coisas.

Felizmente para você, alguém escreveu o código para fazer isso:

link

    
por 26.01.2012 / 16:25
12

Supondo que você tenha a chave privada do SSH id_rsa , você pode extrair a chave pública dela assim:

openssl rsa -in id_rsa -pubout -out id_rsa.pub.pem

Eu sei que o OP perguntou sobre a conversão de uma chave pública, então isso não responde a pergunta, mas eu achei que seria útil para alguns de qualquer maneira.

Note também que este comando resulta em um formato de chave pública PEM, que geralmente é o que o OpenSSL espera. A resposta de Brian, por outro lado, resulta em um arquivo no formato RSAPublicKey, que não é o formato normal esperado pelo OpenSSL (embora versões posteriores possam aparentemente lê-lo via -RSAPublicKey_in flag). Para converter você pode fazer isso:

openssl rsa -RSAPublicKey_in -in id_rsa.rsapub.pem -pubout -out id_rsa.pub.pem
    
por 16.09.2016 / 15:19
7

Semelhante ao método de Amal Chaudhuri abaixo, isso é o que funcionou para mim. Eu precisava criar um arquivo pem da chave pública ssh que eu gerara para o meu cliente SFTP (Cyberduck).

openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem
    
por 01.07.2014 / 20:51
5

O formato desejado é o que ssh-keygen chama PKCS8 . Então, o seguinte comando produzirá a saída desejada:

ssh-keygen -f key.pub -e -m pkcs8

Na página ssh-keygen man:

-m key_format
         Specify a key format for the -i (import) or -e (export) conversion 
         options.  The supported key formats are: 
         ''RFC4716'' (RFC 4716/SSH2 public or private key), 
         ''PKCS8'' (PEM PKCS8 public key) or 
         ''PEM'' (PEM public key).  
         The default conversion format is ''RFC4716''.
    
por 13.04.2017 / 07:25
-1

Outra maneira de fazer isso de outro site. Postando isso no caso de você precisar de outro método. Funciona muito bem. link

openssl dsa -in ~/.ssh/id_dsa -outform pem > id_dsa.pem
    
por 20.01.2013 / 21:46