Zertifikate / PKI
CSR erzeugen, PFX prüfen, Formate wandeln, Ablauf im Zertifikatsspeicher.
CSR erzeugen
Erzeugt einen Zertifikatsantrag samt Schlüssel, mit allen zusätzlichen Namen (SAN) für Mail- und Autodiscover-Hosts.
Mail + Autodiscover
- Common Name (CN)
-
mail.example.comIm Generator ändern → - Weitere Namen (SAN)
-
mail.example.com, autodiscover.example.comIm Generator ändern → - Schlüsseldatei
-
privkey.pemIm Generator ändern →
PowerShell (Windows)
certreq Bordmittel
@"
[NewRequest]
Subject = "CN=mail.example.com"
KeyLength = 2048
Exportable = TRUE
MachineKeySet = TRUE
[Extensions]
2.5.29.17 = "{text}dns=mail.example.com&dns=autodiscover.example.com"
"@ | Set-Content req.inf
certreq -new req.inf mail.example.com.csr openssl Zusatztool
openssl req -new -newkey rsa:2048 -nodes -keyout privkey.pem -out mail.example.com.csr -subj "/CN=mail.example.com" -addext "subjectAltName=DNS:mail.example.com,DNS:autodiscover.example.com" Unix-Shell (bash)
openssl Bordmittel
openssl req -new -newkey rsa:2048 -nodes -keyout privkey.pem -out mail.example.com.csr -subj "/CN=mail.example.com" -addext "subjectAltName=DNS:mail.example.com,DNS:autodiscover.example.com" certtool Zusatztool
certtool --generate-privkey --outfile privkey.pem && certtool --generate-request --load-privkey privkey.pem --outfile mail.example.com.csr Moderne Browser und Server werten ausschliesslich die SAN-Einträge aus; der Common Name allein reicht seit Jahren nicht mehr. certreq legt den Schlüssel im Windows-Zertifikatsspeicher ab, openssl in einer Datei.
CSR prüfen
Zeigt den Inhalt eines Zertifikatsantrags, bevor er zur Zertifizierungsstelle geht: Namen, Schlüssellänge und Signatur.
- Common Name (CN)
-
mail.example.comIm Generator ändern →
PowerShell (Windows)
certutil Bordmittel
certutil -dump mail.example.com.csr openssl Zusatztool
openssl req -in mail.example.com.csr -noout -text -verify Unix-Shell (bash)
openssl Bordmittel
openssl req -in mail.example.com.csr -noout -subject -reqopt no_sigdump -text | head -20 certtool Zusatztool
certtool --crq-info --infile mail.example.com.csr PFX-Datei prüfen
Zeigt Inhaber, Aussteller, Gültigkeit und Kette einer PFX-/P12-Datei und ob der private Schlüssel enthalten ist.
- PFX-Datei
-
cert.pfxIm Generator ändern →
PowerShell (Windows)
Get-PfxData Bordmittel
$pw = Read-Host "PFX-Passwort" -AsSecureString
$d = Get-PfxData -FilePath "cert.pfx" -Password $pw
$d.EndEntityCertificates | Format-List Subject, Issuer, NotAfter, Thumbprint, HasPrivateKey
$d.OtherCertificates | ForEach-Object { $_.Subject } openssl Zusatztool
openssl pkcs12 -in cert.pfx -nokeys -info | openssl x509 -noout -subject -issuer -dates Unix-Shell (bash)
openssl Bordmittel
openssl pkcs12 -in cert.pfx -nokeys -legacy 2>/dev/null | openssl x509 -noout -subject -issuer -dates certtool Zusatztool
certtool --p12-info --infile cert.pfx Bei älteren PFX-Dateien braucht OpenSSL 3 den Schalter -legacy, weil der alte RC2-Algorithmus sonst abgelehnt wird.
Formate wandeln
Wandelt zwischen PFX/P12 und PEM (Zertifikat und Schlüssel getrennt): der häufigste Schritt beim Umzug eines Zertifikats zwischen Windows und einer Appliance.
- PFX-Datei
-
cert.pfxIm Generator ändern → - Zertifikatsdatei
-
cert.pemIm Generator ändern → - Schlüsseldatei
-
privkey.pemIm Generator ändern →
PowerShell (Windows)
certutil / Export-PfxCertificate Bordmittel
# PFX -> Base64-PEM (nur Zertifikat, ohne Schlüssel)
certutil -encode cert.pem.der cert.pem
# Zertifikat aus dem Store als PFX exportieren:
# Get-ChildItem Cert:\LocalMachine\My\<Thumbprint> | Export-PfxCertificate -FilePath cert.pfx -Password (Read-Host -AsSecureString) openssl Zusatztool
openssl pkcs12 -in cert.pfx -clcerts -nokeys -out cert.pem
openssl pkcs12 -in cert.pfx -nocerts -nodes -out privkey.pem Unix-Shell (bash)
openssl Bordmittel
openssl pkcs12 -in cert.pfx -clcerts -nokeys -out cert.pem
openssl pkcs12 -in cert.pfx -nocerts -nodes -out privkey.pem
openssl pkcs12 -export -in cert.pem -inkey privkey.pem -out neu.pfx certtool Zusatztool
certtool --load-certificate cert.pem --load-privkey privkey.pem --to-p12 --outfile neu.p12 Die erzeugte Schlüsseldatei ist unverschlüsselt. Nach dem Import wieder löschen und nicht im Netzlaufwerk liegen lassen.
Passen Schlüssel und Zertifikat?
Prüft, ob eine Schlüsseldatei zum Zertifikat gehört: identische Prüfsumme heisst, sie gehören zusammen.
- Zertifikatsdatei
-
cert.pemIm Generator ändern → - Schlüsseldatei
-
privkey.pemIm Generator ändern →
PowerShell (Windows)
X509Certificate2 Bordmittel
$c = New-Object Security.Cryptography.X509Certificates.X509Certificate2 "cert.pem"
"HasPrivateKey: $($c.HasPrivateKey)"
$c.PublicKey.Key.ToXmlString($false).Substring(0, 60) openssl Zusatztool
openssl x509 -in cert.pem -noout -modulus | openssl md5
openssl rsa -in privkey.pem -noout -modulus | openssl md5 Unix-Shell (bash)
openssl Bordmittel
openssl x509 -in cert.pem -noout -modulus | openssl sha256
openssl rsa -in privkey.pem -noout -modulus | openssl sha256
# Gleiche Prüfsumme = Schlüssel und Zertifikat gehören zusammen. certtool Zusatztool
certtool --certificate-info --infile cert.pem | grep -A2 "Public Key ID" Die häufigste Ursache für «Zertifikat lässt sich nicht importieren» ist genau diese Verwechslung.
Zertifikatsspeicher ansehen
Listet die installierten Zertifikate mit Fingerabdruck, Inhaber und Ablauf.
- Fingerabdruck (Thumbprint)
-
A1B2C3D4E5F6A7B8C9D0E1F2A3B4C5D6E7F8A9B0Im Generator ändern →
PowerShell (Windows)
Cert: PSDrive Bordmittel
Get-ChildItem Cert:\LocalMachine\My | Sort-Object NotAfter |
Format-Table Thumbprint, Subject, NotAfter, HasPrivateKey -AutoSize
Get-Item Cert:\LocalMachine\My\A1B2C3D4E5F6A7B8C9D0E1F2A3B4C5D6E7F8A9B0 | Format-List * certutil Bordmittel
certutil -store My Unix-Shell (bash)
ls / openssl Bordmittel
ls -1 /etc/ssl/certs | head -20
awk -v cmd='openssl x509 -noout -subject -enddate' '/BEGIN/{close(cmd)};{print | cmd}' /etc/ssl/certs/ca-certificates.crt | head -20 trust Zusatztool
trust list --filter=ca-anchors | head -40 Der Fingerabdruck ist unter Windows die eindeutige Kennung, mit der Exchange und IIS ein Zertifikat zuweisen.
Was läuft bald ab?
Findet Zertifikate, die in den nächsten 60 Tagen ablaufen: der Check, der einen Ausfall am Wochenende verhindert.
PowerShell (Windows)
Cert: PSDrive Bordmittel
Get-ChildItem Cert:\LocalMachine\My |
Where-Object { $_.NotAfter -lt (Get-Date).AddDays(60) } |
Sort-Object NotAfter |
Format-Table Subject, NotAfter, Thumbprint -AutoSize certutil Zusatztool
certutil -store My | findstr /C:"NotAfter" Unix-Shell (bash)
openssl Bordmittel
for c in /etc/ssl/certs/*.pem; do
openssl x509 -in "$c" -noout -checkend 5184000 >/dev/null 2>&1 || echo "laeuft bald ab: $c"
done certtool Zusatztool
certtool --certificate-info --infile /etc/ssl/certs/ssl-cert-snakeoil.pem | grep -E "Not After"