Convertendo o certificado PKCS # 12 em PEM usando OpenSSL


212

Eu tenho o OpenSSL x64 no Windows 7, que baixei do openssl-for-windows no Google Code . Estou tentando executar:

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" 

mas eu recebo um erro.

unable to load private key

Como extrair o certificado no PEM da loja PKCS # 12 usando o OpenSSL?


@jww Eu acho que, considerando que essa pergunta tem mais de 3 anos, é um pouco tarde para sinalizar a bandeira fora do tópico.
Dean MacGregor

Apenas uma formalidade para que as pessoas saibam o que está fora do assunto. As pessoas estão fazendo as mesmas perguntas fora do tópico e citando esta pergunta. Se o pessoal não for informado sobre o assunto, eles continuarão perguntando no Stack Overflow.
JWW

2
@jww a resposta mais votada na meta questão que você vincula diz "As perguntas do DevOps devem ser permitidas no estouro de pilha". Vou upvote, porque a resposta se reuniu as minhas necessidades (embora, para mim, eu não estava programando, eu poderia facilmente incorporar a resposta em um programa, se quisesse)
dcorking

Respostas:


534

Experimentar:

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys
openssl pkcs12 -in path.p12 -out newfile.key.pem -nocerts -nodes

Depois disso você tem:

  • certificado em newfile.crt.pem
  • chave privada em newfile.key.pem

Para colocar o certificado e a chave no mesmo arquivo, use o seguinte

openssl pkcs12 -in path.p12 -out newfile.pem

Se você precisar inserir a senha do PKCS # 12 diretamente da linha de comando (por exemplo, um script), basta adicionar -passin pass:${PASSWORD}:

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys -passin 'pass:P@s5w0rD'

2
É possível que a chave privada e o certificado sejam armazenados no mesmo arquivo * .pem?
Ramis

18
sim, é:openssl pkcs12 -in path.p12 -out newfile.pem
Gee-Bee

2
pedindo senha de importação. o que é isso ?
Saurabh Chandra Patel

4
@SaurabhChandraPatel, você precisa saber a senha do seu certificado. Este não é um meio para recuperar uma senha esquecida
Dean MacGregor

2
omitindo -nodes, a chave privada não é extraída.
Meixner

22

Você só precisa fornecer uma senha. Você pode fazê-lo na mesma linha de comando com a seguinte sintaxe:

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" -passin pass:[password]

Você será solicitado a fornecer uma senha para criptografar a chave privada no seu arquivo de saída. Inclua a opção "nós" na linha acima se desejar exportar a chave privada não criptografada (texto sem formatação):

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" -passin pass:[password] -nodes

Mais informações: http://www.openssl.org/docs/apps/pkcs12.html


16

Se você pode usar o Python, é ainda mais fácil se você tiver o pyopensslmódulo. Aqui está:

from OpenSSL import crypto

# May require "" for empty password depending on version

with open("push.p12", "rb") as file:
    p12 = crypto.load_pkcs12(file.read(), "my_passphrase")

# PEM formatted private key
print crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey())

# PEM formatted certificate
print crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate())

Existe algum motivo para abrir o arquivo usando filee não open? Eu só quero entendê-la como eu estou indo para usá-lo no futuro (para simplificar a minha openssh solução vocação de comando)
Jan Vlcinsky

Não, não há diferença. Você pode apenas fazer open("push.p12", 'rb').read().
KVISH

2
Se você estiver usando o python 3, provavelmente desejará escrever o conteúdo em arquivos: with open("push.pem", "wb") as fobj: fobj.write(crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate()))para escrever o certificado e with open("push.key", "wb") as fobj: fobj.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey()))a chave.
Adam Parkin

Estou usando python 3.7, ao executar o exemplo acima, recebo o seguinte: "TypeError: o inicializador para o ctype 'char' deve ser um bytes de comprimento 1, não str" "Há algo errado com minha senha
getaglow

Por que é "ainda mais fácil" criar um arquivo, inserir o código, salvá-lo e executá-lo - em vez de apenas executar um único comando?
Torben Gundtofte-Bruun 02/07/19

3

Eu tinha um arquivo PFX e precisava criar o arquivo KEY para NGINX, então fiz isso:

openssl pkcs12 -in file.pfx -out file.key -nocerts -nodes

Então eu tive que editar o arquivo KEY e remover todo o conteúdo até -----BEGIN PRIVATE KEY-----. Depois disso, o NGINX aceitou o arquivo KEY.


0

Se você precisar de um arquivo PEM sem nenhuma senha, poderá usar esta solução.

Apenas copie e cole a chave privada e o certificado no mesmo arquivo e salve como .pem.

O arquivo será parecido com:

-----BEGIN PRIVATE KEY-----
............................
............................
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
...........................
...........................
-----END CERTIFICATE-----

Essa foi a única maneira que encontrei para enviar certificados para dispositivos Cisco para HTTPS.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.