Zertifikatsformate & OpenSSL

Welches Format wofür gedacht ist, woran man es erkennt – und wie man selbst umwandelt.

Die Formate im Überblick

FormatEndungenErkennbar anEnthältTypisch für
PEM.pem .crt .cer .keyText mit -----BEGIN …-----Zertifikate, Kette, Schlüssel – einzeln oder zusammennginx, Apache, HAProxy, Linux allgemein
DER.der .cerBinärdatei, im Editor unlesbargenau ein Zertifikat oder ein SchlüsselJava, Windows-Import einzelner Zertifikate, Embedded-Geräte
PKCS#7 / P7B.p7b .p7c-----BEGIN PKCS7----- oder binärZertifikate und Kette, kein SchlüsselWindows, Tomcat, Download von Zwischenzertifikaten
PKCS#12 / PFX.pfx .p12Binär, passwortgeschütztZertifikat, Kette und Schlüssel in einer DateiWindows/IIS, Azure, Exchange, macOS-Schlüsselbund, moderne Java-Keystores
JKS.jks .keystoreBinär, beginnt mit FE ED FE EDSchlüssel und Zertifikate unter AliasnamenTomcat, ältere Java-Anwendungen (seit Java 9 ist PKCS#12 Standard)
OpenSSH-Schlüsselid_rsa, id_ed25519, id_ecdsa-----BEGIN OPENSSH PRIVATE KEY-----privater Schlüssel für SSHSSH-Logins, Git, Server
PuTTY.ppkText, beginnt mit PuTTY-User-Key-File-privater + öffentlicher SchlüsselPuTTY, WinSCP, FileZilla unter Windows

Die Endung allein ist nicht verlässlich: Eine .cer-Datei kann PEM oder DER sein. Der Konverter erkennt das Format deshalb am Inhalt.

Begriffe

OpenSSL-Befehle

Nach jeder Prüfung oder Umwandlung zeigt der Konverter die passenden Befehle für Ihre Dateien an. Hier die allgemeine Übersicht. Unter Windows ist OpenSSL z. B. in Git for Windows enthalten; keytool gehört zu jedem Java.

PEM →

# PEM nach DER
openssl x509 -in cert.pem -outform der -out cert.der
openssl pkey -in key.pem -outform der -out key.der

# PEM nach P7B (Zertifikat + Kette)
openssl crl2pkcs7 -nocrl -certfile cert.pem -certfile chain.pem -out certificate.p7b

# PEM nach PFX
openssl pkcs12 -export -inkey key.pem -in cert.pem -certfile chain.pem -out certificate.pfx

# PFX für alte Systeme (Windows Server ≤ 2016, Java ≤ 8)
openssl pkcs12 -export -inkey key.pem -in cert.pem -certfile chain.pem \
  -certpbe PBE-SHA1-3DES -keypbe PBE-SHA1-3DES -macalg sha1 -out certificate.pfx

# Alles in eine PEM-Datei (Windows: type statt cat)
cat cert.pem chain.pem key.pem > certificate.pem

DER →

openssl x509 -inform der -in cert.der -out cert.pem
openssl pkey -inform der -in key.der -out key.pem

P7B →

# P7B nach PEM (bei binärer P7B zusätzlich -inform der)
openssl pkcs7 -print_certs -in certificate.p7b -out certs.pem

# P7B + Schlüssel nach PFX
openssl pkcs7 -print_certs -in certificate.p7b -out certs.pem
openssl pkcs12 -export -inkey key.pem -in certs.pem -out certificate.pfx

PFX →

# bei alten PFX-Dateien mit OpenSSL 3: zusätzlich -legacy
openssl pkcs12 -in certificate.pfx -clcerts -nokeys -out cert.pem
openssl pkcs12 -in certificate.pfx -cacerts -nokeys -out chain.pem
openssl pkcs12 -in certificate.pfx -nocerts -nodes  -out key.pem   # Schlüssel unverschlüsselt!

# PFX nach JKS
keytool -importkeystore -srckeystore certificate.pfx -srcstoretype PKCS12 \
  -destkeystore keystore.jks -deststoretype JKS

JKS →

# JKS nach PFX, danach wie oben weiter nach PEM
keytool -importkeystore -srckeystore keystore.jks -srcstoretype JKS \
  -destkeystore certificate.p12 -deststoretype PKCS12

SSH-Schlüssel →

# OpenSSH-Schlüssel nach PEM (PKCS#8) – auf einer Kopie, fragt ggf. nach dem Passwort
cp id_ed25519 key.pem && ssh-keygen -p -m PKCS8 -N "" -f key.pem

# PuTTY-Schlüssel nach PEM (puttygen aus dem PuTTY-Paket)
puttygen key.ppk -O private-openssh -o key.pem

Prüfen

# Inhalt eines Zertifikats anzeigen
openssl x509 -in cert.pem -noout -subject -issuer -dates -ext subjectAltName

# Passen Schlüssel und Zertifikat zusammen? (beide Ausgaben müssen gleich sein)
openssl x509 -in cert.pem -noout -pubkey | openssl sha256
openssl pkey -in key.pem -pubout | openssl sha256

# Kette prüfen
openssl verify -untrusted chain.pem cert.pem

# Sperrstatus per OCSP (Adresse steht im Zertifikat: openssl x509 -noout -ocsp_uri)
openssl ocsp -issuer chain.pem -cert cert.pem -url http://ocsp.example.com -resp_text

# Mailserver mit STARTTLS prüfen
openssl s_client -connect mail.example.com:587 -starttls smtp -servername mail.example.com