aethercert
Dokumentation

Windows-Zertifikatspeicher: Zertifikat austauschen

PFX mit Import-PfxCertificate in den Zertifikatspeicher des lokalen Computers importieren, HasPrivateKey prüfen, Zugriff auf den privaten Schlüssel erteilen und Dienste prüfen.

Der Windows-Zertifikatspeicher ist ein Ablageort, kein TLS-Endpunkt. Ein neu importiertes Zertifikat steht Windows-Diensten zur Verfügung, wird aber von IIS, RDP, SQL Server oder einer anderen Anwendung noch nicht verwendet. Jeder dieser Dienste braucht weiterhin seine eigene Bindung bzw. einen aktualisierten Fingerabdruck (Thumbprint).

Voraussetzungen

  • Besorgen Sie eine PKCS#12/PFX-Datei mit dem Serverzertifikat und dem passenden privaten Schlüssel sowie das zugehörige Kennwort. Enthält die PFX-Datei die Zwischenzertifikate nicht, importieren Sie diese zusätzlich unter Zwischenzertifizierungsstellen.
  • Prüfen Sie, ob das Zertifikat die nötigen DNS-SANs, die erweiterte Schlüsselverwendung (EKU), die Gültigkeit und den Schlüsselalgorithmus für den jeweiligen Dienst hat.
  • Notieren Sie den Fingerabdruck des alten Zertifikats und jeden Dienst, der ihn verwendet.
  • Arbeiten Sie in einer Sitzung mit erhöhten Rechten. Die meisten Serveranwendungen benötigen Cert:\LocalMachine\My, nicht den Speicher CurrentUser des angemeldeten Benutzers.

Wie Windows Zertifikate speichert

LocalMachine\My ist der Speicher Eigene Zertifikate des Computers. Der Eintrag verweist auf einen Container für den privaten Schlüssel, der durch Windows-ACLs geschützt ist. Ein Import als Administrator gibt einem beliebigen Dienstkonto nicht automatisch das Recht, diesen Schlüssel zu verwenden. Private Schlüssel verwalten im Zertifikate-Snap-In gehört deshalb bei Diensten, die nicht als Lokales System laufen, fest zum Zertifikatstausch dazu.

Zertifikat Schritt für Schritt austauschen

  1. PFX prüfen, ohne das Kennwort im Shell-Verlauf zu hinterlassen:

    $pfxPath = "C:\secure\replacement.pfx"
    $pfxPassword = Read-Host "PFX password" -AsSecureString
    Get-PfxData -FilePath $pfxPath -Password $pfxPassword |
      Format-List EndEntityCertificates,OtherCertificates
  2. In den Speicher Eigene Zertifikate des lokalen Computers importieren:

    $imported = Import-PfxCertificate `
      -FilePath $pfxPath `
      -CertStoreLocation Cert:\LocalMachine\My `
      -Password $pfxPassword
    $thumbprint = $imported.Thumbprint

    Verwenden Sie -Exportable nur, wenn ein späterer Export ausdrücklich nötig ist - der Schalter schwächt einen sinnvollen Schutz des privaten Schlüssels.

  3. Privaten Schlüssel und Kette prüfen:

    Get-Item "Cert:\LocalMachine\My\$thumbprint" |
      Format-List Subject,DnsNameList,NotAfter,EnhancedKeyUsageList,HasPrivateKey,Thumbprint
    Export-Certificate -Cert "Cert:\LocalMachine\My\$thumbprint" -FilePath C:\Temp\new.cer
    certutil -verify -urlfetch C:\Temp\new.cer

    HasPrivateKey muss True sein. certutil -verify -urlfetch baut die Kette auf und prüft die Sperrung; es braucht eine Zertifikatsdatei, daher der Export.

  4. Läuft der Windows-Dienst unter einem eigenen Konto, öffnen Sie certlm.msc (die Konsole für die Zertifikate des Computers), wählen Eigene Zertifikate > Zertifikate, klicken mit der rechten Maustaste auf das neue Zertifikat und wählen Alle Aufgaben > Private Schlüssel verwalten. Erteilen Sie dem Dienstkonto (bei einem virtuellen Konto wie NT SERVICE\<Dienst> genau so eintippen) nur Lesen, nicht Vollzugriff.

  5. Zertifikatseinstellung oder Bindung des Dienstes aktualisieren. Nutzen Sie dafür die jeweilige Anleitung für IIS, AD FS, SQL Server oder das jeweilige Produkt. Starten Sie nur das Produkt neu, dessen Anleitung das verlangt.

Cluster und Gruppenrichtlinien

Dasselbe Zertifikat kann auf mehreren Clusterknoten installiert sein, aber privater Schlüssel und Speichereintrag sind lokal pro Knoten. Importieren Sie es auf jedem Knoten, der TLS terminiert. Die Zertifikatsverteilung per Gruppenrichtlinie verteilt in der Regel öffentliche Zertifikate und Vertrauensanker - gehen Sie nicht davon aus, dass sie den privaten Schlüssel eines Servers verteilt.

Neues Zertifikat prüfen

Prüfen Sie beide Ebenen. Zuerst den lokalen Speicher wie oben. Danach eine Verbindung zum tatsächlichen Hostnamen und Port, denn ein korrekter Speicher sagt nichts über die aktive Bindung aus. Das Skript unten akzeptiert absichtlich jedes Zertifikat ({$true}) - es soll zeigen, was der Dienst ausliefert, nicht das Vertrauen bewerten:

$client = [Net.Sockets.TcpClient]::new("service.example.com",443)
$stream = [Net.Security.SslStream]::new($client.GetStream(),$false,({$true}))
$stream.AuthenticateAsClient("service.example.com")
[Security.Cryptography.X509Certificates.X509Certificate2]::new($stream.RemoteCertificate) |
  Format-List Subject,Issuer,Thumbprint,NotAfter
$stream.Dispose(); $client.Dispose()

Rollback

Der Speicher selbst braucht keinen Rollback: Das alte Zertifikat bleibt darin, bis Sie es löschen. Stellen Sie den Dienst nach der Anleitung des Produkts wieder auf den notierten alten Fingerabdruck um - etwa die Bindung im IIS - und führen Sie aus, was das Produkt dafür braucht (Reload oder Neustart). Löschen Sie den neuen Eintrag erst, wenn der Rollback bestätigt ist.

Häufige Probleme

  • Die PFX-Datei wurde in CurrentUser statt in LocalMachine importiert.
  • HasPrivateKey ist False, weil nur eine .cer-Datei importiert wurde. Importieren Sie stattdessen die PFX-Datei. Liegt der passende Schlüssel schon auf dem Rechner, kann certutil -repairstore my <Seriennummer> Zertifikat und Schlüssel wieder verknüpfen.
  • Das Dienstkonto kann den Schlüsselcontainer nicht lesen.
  • Die Kette ist unvollständig oder die Stammzertifizierungsstelle ist bei den Clients nicht vertrauenswürdig.
  • Das richtige Zertifikat ist installiert, die Anwendung verweist aber noch auf den alten Fingerabdruck.

Zertifikatstausch mit aethercert automatisieren

aethercert kann Zertifikat und privaten Schlüssel in den gewählten Windows-Speicher importieren. Für Produktvorlagen übernimmt es auch den unterstützten Bindungs- bzw. Zuweisungsschritt; ein reines Zertifikatspeicher-Ziel legt bewusst keine Anwendungsbindung an.

Unter Deployment-Ziele finden Sie die Felder dieser Vorlage, die Voraussetzungen auf dem Host und den Stand der Verifizierung.

Quellen

Auf dieser Seite