Konwersja certyfikatu PKCS # 12 na PEM przy użyciu OpenSSL

212

Mam OpenSSL x64 na Windows 7, który pobrałem z openssl-for-windows na Google Code . Próbuję uruchomić:

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

ale dostaję błąd.

unable to load private key

Jak wyodrębnić certyfikat w PEM ze sklepu PKCS # 12 przy użyciu OpenSSL?

Dean MacGregor
źródło
@jww Myślę, że biorąc pod uwagę, że to pytanie ma ponad 3 lata, jest trochę za późno na zasygnalizowanie flagi nie na temat.
Dean MacGregor
Po prostu formalność, aby ludzie znali jej temat. Ludzie zadają te same pytania nie na temat i cytują to pytanie. Jeśli ludziom nie powie się, że jest nie na temat, będą nadal pytać o przepełnienie stosu.
jww
2
@jww najwyższa głosowana odpowiedź na meta pytanie, które podałeś, mówi: „Pytania dotyczące DevOps powinny być dozwolone w przypadku przepełnienia stosu”. Będę głosować, ponieważ odpowiedź spełniła moje potrzeby (chociaż dla mnie nie programowałam, mogłabym z łatwością włączyć odpowiedź do programu, jeśli bym sobie tego życzyła)
dcorking

Odpowiedzi:

536

Próbować:

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

Następnie masz:

  • certyfikat w newfile.crt.pem
  • klucz prywatny w newfile.key.pem

Aby umieścić certyfikat i klucz w tym samym pliku, wykonaj następujące czynności

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

Jeśli musisz wprowadzić hasło PKCS # 12 bezpośrednio z wiersza poleceń (np. Skryptu), po prostu dodaj -passin pass:${PASSWORD}:

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys -passin 'pass:P@s5w0rD'
kmx
źródło
2
Czy to możliwe, że klucz prywatny i certyfikat będą przechowywane w tym samym pliku * .pem?
Ramis,
18
tak, to jest:openssl pkcs12 -in path.p12 -out newfile.pem
Gee-Bee
2
z prośbą o hasło importowe. co to jest ?
Saurabh Chandra Patel
4
@SaurabhChandraPatel musisz znać hasło do certyfikatu. To nie jest sposób na odzyskanie zapomnianego hasła
Dean MacGregor
2
pomijając -nodes, klucz prywatny nie zostanie wyodrębniony.
Meixner
22

Musisz tylko podać hasło. Możesz to zrobić w tym samym wierszu polecenia, stosując następującą składnię:

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

Zostaniesz poproszony o podanie hasła do zaszyfrowania klucza prywatnego w pliku wyjściowym. Dołącz opcję „węzły” w powyższym wierszu, jeśli chcesz wyeksportować klucz prywatny w postaci niezaszyfrowanej (zwykły tekst):

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

Więcej informacji: http://www.openssl.org/docs/apps/pkcs12.html

Colin
źródło
16

Jeśli możesz używać Pythona, jeszcze łatwiej jest, jeśli masz pyopensslmoduł. Oto on:

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())
KVISH
źródło
Czy istnieje jakiś powód, aby otworzyć plik przy użyciu, filea nie open? Chcę to po prostu zrozumieć, gdy będę go używać w przyszłości (aby uprościć moje rozwiązanie, wywołując openssh jako polecenie)
Jan Vlcinsky
Nie, nie ma różnicy. Możesz po prostu zrobić open("push.p12", 'rb').read().
KVISH
2
Jeśli używasz Pythona 3, prawdopodobnie będziesz chciał zapisać zawartość do plików: with open("push.pem", "wb") as fobj: fobj.write(crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate()))aby napisać certyfikat i with open("push.key", "wb") as fobj: fobj.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey()))klucz.
Adam Parkin
Korzystam z Pythona 3.7, gdy uruchamiam powyższy przykład, otrzymuję: „TypeError: initializer dla ctype 'char' musi być bajtami o długości 1, a nie str. Czy moje hasło jest coś nie tak
getaglow,
Dlaczego „jeszcze łatwiej” jest utworzyć plik, wprowadzić kod, zapisać go i uruchomić - zamiast wykonywać tylko jedno polecenie?
Torben Gundtofte-Bruun
3

Miałem plik PFX i potrzebowałem utworzyć plik KEY dla NGINX, więc zrobiłem to:

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

Następnie musiałem edytować plik KEY i usunąć całą zawartość do -----BEGIN PRIVATE KEY-----. Następnie NGINX zaakceptował plik KEY.

KTCO
źródło
0

Jeśli potrzebujesz pliku PEM bez hasła, możesz skorzystać z tego rozwiązania.

Po prostu skopiuj i wklej klucz prywatny i certyfikat do tego samego pliku i zapisz jako .pem.

Plik będzie wyglądał następująco:

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

To jedyny sposób, w jaki znalazłem przesyłanie certyfikatów na urządzenia Cisco dla HTTPS.

Yeya
źródło