Extrair chave pública / privada do arquivo PKCS12 para uso posterior na autenticação SSH-PK

194

Desejo extrair a chave pública e privada do meu PKCS#12arquivo para uso posterior em SSH-Public-Key-Authentication.

No momento, estou gerando chaves via ssh-keygen nas quais eu coloco .ssh/authorized_key, respectivamente em algum lugar do lado do cliente.

No futuro, quero usar as chaves de um PKCS#12contêiner, para extrair a chave pública primeiro PKCS#12e depois colocá-las no .ssh/authorized_keysarquivo. Existe alguma chance de fazer isso funcionar openssl? As chaves são PKCS#12compatíveis para autenticação de chave pública ssh?

lazydaemon
fonte

Respostas:

283

Você pode usar os seguintes comandos para extrair a chave pública / privada de um contêiner PKCS # 12:

  • Chave privada PKCS # 1

    openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
    
  • Certificados:

    openssl pkcs12 -in yourP12File.pfx -clcerts -nokeys -out publicCert.pem
    
Nilesh
fonte
7
os comandos funcionam, mas a chave privada é exportada como formato PKCS1 e eu preciso do PKCS8 ... Existe alguma opção que esteja faltando para obter isso? Por exemplo, ele exporta '----- BEGIN RSA PRIVATE KEY -----' mas eu preciso '----- BEGIN PRIVATE KEY -----'
edthethird
4
Para fazer isso você poderia tentaropenssl rsa -in privateKey.pem -out private.pem
François
27
@edthethird: Para obter o PKCS8, adicione o sinalizador -nodes #
Christopher K.
7
Para exportar sem senha, adicione -passout pass:. Ele espera que o parâmetro esteja no formato pass: mypassword. stackoverflow.com/a/27497899/206277
nidheeshdas
2
@ChristopherK. obrigado! essa foi a boa para mim. adicionando -nodesexporta a chave corretamente
TecHunter 17/02
85

Isso é possível com um pouco de conversão de formato.

Para extrair a chave privada em um formato, o openssh pode usar:

openssl pkcs12 -in pkcs12.pfx -nocerts -nodes | openssl rsa > id_rsa

Para converter a chave privada em uma chave pública:

openssl rsa -in id_rsa -pubout | ssh-keygen -f /dev/stdin -i -m PKCS8

Para extrair a chave pública em um formato, o openssh pode usar:

openssl pkcs12 -in pkcs12.pfx -clcerts -nokeys | openssl x509 -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8
Ryanc
fonte
2
Obrigado! A primeira linha era a que eu precisava. Apenas a chave, não criptografada, para que possa ser instalada pela maioria dos sistemas automatizados de CDNs.
BTC
1
@ PhillipRego Eu acho que você tem chaves públicas e privadas confusas. Uma chave pública RSA possui dois valores, 'e' o expoente público e 'n' o módulo - ambos armazenados ao lado das partes privadas da chave.
21717 ryanc #
17

O OpenSSH não pode usar arquivos PKCS # 12 prontos para uso. Como outros sugeriram, você deve extrair a chave privada no formato PEM, que o leva da região do OpenSSL para o OpenSSH. Outras soluções mencionadas aqui não funcionam para mim. Eu uso o OS X 10.9 Mavericks (10.9.3 no momento) com utilitários "pré-empacotados" (OpenSSL 0.9.8y, OpenSSH 6.2p2).

Primeiro, extraia uma chave privada no formato PEM que será usada diretamente pelo OpenSSH:

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa > ~/.ssh/id_rsa

Eu sugiro fortemente criptografar a chave privada com senha:

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa -passout 'pass:Passw0rd!' > ~/.ssh/id_rsa

Obviamente, escrever uma senha em texto sem formatação na linha de comando também não é seguro; portanto, você deve excluir o último comando do histórico ou apenas garantir que ele não chegue lá. Conchas diferentes têm maneiras diferentes. Você pode prefixar seu comando com espaço para impedir que ele seja salvo no histórico no Bash e em muitos outros shells. Veja também como excluir o comando do histórico no Bash:

history -d $(history | tail -n 2 | awk 'NR == 1 { print $1 }')

Como alternativa, você pode usar uma maneira diferente de passar uma senha de chave privada para o OpenSSL - consulte a documentação do OpenSSL para obter argumentos de frase secreta .

Em seguida, crie uma chave pública OpenSSH que possa ser adicionada ao arquivo allowed_keys:

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub
frzng
fonte
Para que | openssl rsaserve?
Snekse 17/09/2015
1
@Snekse, garante que haja apenas chave privada na saída. No meu caso, ele cria o arquivo de identidade ( ~/.ssh/id_rsa) com algum "cruft" como Bag Attributes sem `| openssl rsa`. Eu acho que o OpenSSH e outros utilitários que usam arquivos de identidade podem lidar com esse problema (eu não tentei), mas eu sou simplesmente usado para fornecer apenas os dados necessários e nada mais, especialmente se houver algo relacionado à segurança.
Frzng 23/09/2015
1
Esta resposta funcionou para eu obter acesso à chave privada no formato PEM no terminal, que eu era capaz de copiar / colar: openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts
BillyRayCyrus
7

Solução 1:

Extrair P12 de jks

keytool -importkeystore -srckeystore MyRootCA.jks -destkeystore MyRootCA.p12 -deststoretype PKCS12

Extraia o PEM do P12 e edite o arquivo e pem do arquivo crt

openssl pkcs12 -in MyRootCA.p12 -clcerts -nokeys -out MyRootCA.crt

Extrair chave de jks

openssl pkcs12 -in MyRootCA.p12 -nocerts -out encryptedPrivateKey.pem
openssl rsa -in encryptedPrivateKey.pem -out decryptedPrivateKey.key

Solução 2:

Extraia o PEM e o criptografadoPrivateKey para o arquivo txt ''

openssl pkcs12 -in MyRootCA.p12 -out keys_out.txt

Descriptografar privateKey

openssl rsa -in encryptedPrivateKey.key [-outform PEM] -out decryptedPrivateKey.key
Ali Alimohammadi
fonte
1
Ao responder perguntas, ajuda a destacar quais são os comandos. Você pode fazer isso adicionando três aspas anteriores e posteriores ao comando para que o `` eco olá`` se torne echo hello.
Pats
2

Atualização: notei que minha resposta era apenas uma duplicata ruim de uma pergunta bem explicada em https: //unix.stackexchange.com / ... por BryKKan

Aqui está um extrato:

openssl pkcs12 -in <filename.pfx> -nocerts -nodes | sed -ne '/-BEGIN PRIVATE KEY-/,/-END PRIVATE KEY-/p' > <clientcert.key>

openssl pkcs12 -in <filename.pfx> -clcerts -nokeys | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <clientcert.cer>

openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <cacerts.cer>
gvlax
fonte
3
Adicionar algumas explicações tornaria essa resposta mais útil.
Mx0
0

Tanto quanto eu sei, o PKCS # 12 é apenas um armazenamento de certificados / chaves públicas / privadas. Se você extraiu uma chave pública do arquivo PKCS # 12, o OpenSSH deve poder usá-la desde que tenha sido extraída no formato PEM . Você provavelmente já sabe que também precisa de uma chave privada correspondente (também no PEM ) para usá-la na autenticação de chave pública ssh.

sirgeorge
fonte
0

A resposta aceita é o comando correto, só quero adicionar uma coisa adicional. Ao extrair a chave, se você deixar a senha do PEM ( "Enter PEM pass phrase:") em branco, a chave completa não será extraída, mas apenas a localKeyIDextraída. Para obter a chave completa, você deve especificar uma senha PEM executando o seguinte comando.

Observe que, quando se trata de Importar senha, você pode especificar a senha real "Enter Import Password:"ou deixá-la em branco:

openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
Arvind Sachdeva
fonte
1
Esse deve ser um comentário para a resposta aceita, não a resposta.
Styx