Como converter uma chave pública ssh-keygen em um formato que a função PEM_read_bio_RSA_PUBKEY () será consumida?

49

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

Obviamente, não posso simplesmente usar a string ASCII no ssh-keygen <>.pubarquivo de chave, pois está no formato de arquivo SSH ou talvez eu SubjectPublicKeyInfoestrutura.

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

Eu encontrei um conversor em php na web que converterá o conteúdo da chave pública em um formato de seqüência de caracteres base64 PEM ASCII. No entanto, a função ainda não gosta.

A documentação do Openssl declara:

  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 nos dois formatos que a função OpenSSL a consumirá?

PeteP
fonte
Descobri isso: use a ferramenta openssl apenas como tal:
PeteP
Criar chave privada: openssl genrsa -out test.priv.key 2048; Chave pública de saída no mesmo formato (PEM?): Openssl rsa -in test.priv.key -pubout -out test.pub.key
PeteP
Segurança
dave_thompson_085

Respostas:

57

ESTÁ BEM!

Então, entrei no pensamento "Calma, entendi". Acontece que há muito mais do que eu pensava.

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

Se você possui o OpenSSH v. 5.6 ou posterior (eu não tinha no meu laptop), é possível executar o seguinte:

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

O método mais longo de fazer isso é desmembrar sua chave SSH em seus vários componentes (a entrada do blog que encontrei foi acusar o OpenSSH de ser "proprietário", prefiro chamá-lo de "exclusivo") e usar uma biblioteca ASN1 para trocar as coisas.

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

https://gist.github.com/1024558

Brian Redbeard
fonte
9
O ssh-keygenmétodo parece funcionar no Linux, mas não Mac OS X.
tampa
3
Tampa, veja a nota na resposta sobre a versão SSH. O OS X não envia uma versão recente do OpenSSH. Execute o comando ssh -V.
precisa
3
Não funciona OpenSSH_6.2p2. Funciona OpenSSH_6.6p1.
Old Pro
-mnão funciona para mim ... qual é o problema?
pstanton
2
Funciona para mim no mac!
Greg Hornby em
18

Supondo que você tenha a chave privada SSH id_rsa, você pode extrair a chave pública da seguinte maneira:

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

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

Observe também que esse comando resulta em um formato de chave pública do 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 por meio do -RSAPublicKey_insinalizador). Para converter você pode fazer isso:

openssl rsa -RSAPublicKey_in -in id_rsa.rsapub.pem -pubout -out id_rsa.pub.pem
shawkinaw
fonte
Obrigado, o -pubout da chave privada fez o truque para mim.
precisa
openssl rsa -in id_rsa.pem -pubout -out id_rsa.pub.pemtambém funciona (ou seja, a entrada é uma chave privada no formato pem). Boa resposta.
Johnny Wong
11
Atualização: A resposta de Brian foi corrigida e -m pkcs8, apesar de o OpenSSH usar o nome errado , produz X.509 'PUBKEY'. Além disso, desde o OpenSSH 6.5 em 2014-01 se o criador especificou 'novo formato' -opara maior segurança, esse método não funcionará e, já que o 7.8 em 2018-08 'novo formato' agora é o padrão, o mesmo.
dave_thompson_085
11

O formato que você deseja é o que ssh-keygenchama PKCS8. Portanto, o seguinte comando produzirá a saída desejada:

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

Na ssh-keygenpágina do manual:

-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''.
Aaron Meriwether
fonte
Este realmente funciona no Linux e no macOS.
Jay Taylor
extrair a chave pública gerada equivalente da chave privada no OpenSSL openssl rsa -in key -pubout -out key.pub.openssl.pkcs8
Mohannd
6

Semelhante ao método de Amal Chaudhuri abaixo, foi o que funcionou para mim. Eu precisava criar um arquivo pem a partir 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
l3e0wu1f
fonte
isso realmente não parece funcionar.
outside2344
5
Isso funciona apenas para a chave RSA privada, NÃO para a chave pública que o OP estava pedindo. Resposta tão errada.
Devy
3
Na verdade, id_rsajá está no formato certo, você pode conferir sozinho, o resultado id_rsa.pemé 100% idêntico.
Miro Kropacek
-2

Outra maneira de fazer isso em outro site. Publicando isso no caso de você precisar de outro método. Funciona muito bem. http://www.chatur.com.np/2011/01/convert-openssh-rsa-key-to-pem-format.html

openssl dsa -in ~/.ssh/id_dsa -outform pem > id_dsa.pem
Amal Chaudhuri
fonte
Esse método não parece realmente funcionar.
5133 Sean
7
id_rsanão é uma chave pública. Resposta errada.
Ahmet Alp Balkan