
AD FS – Windows-Dienst startet nicht mehr – IT-Praxis aus Oberschwaben
Meine LAB03-Testumgebung umfasst unter anderem eine ADFS-Farm auf Basis von Windows Server 2019. Die Farm hat zwei Knoten. Dementsprechend verfügt das Labor auch über eine separate PKI, die Zertifikate für AD FS-Endpunkte und -Dienste (Tokensignierung, Tokenentschlüsselung, Serverkommunikation) verwendet.
Das bisher verwendete Zertifikat ist am 30. Dezember 2023 abgelaufen. Dementsprechend hat Windows es auch als ungültig markiert.
Beim Versuch, den Dienst „Active Directory Federation Services“ (manuell) zu starten, wird die folgende Fehlermeldung angezeigt.
Sie können die Ereignis-ID 102 in der Ereignisanzeige unter „AD FS/Admin“ sehen.
There was an error in enabling endpoints of Federation Service. Fix configuration errors using PowerShell cmdlets and restart the Federation Service. Additional Data Exception details: System.ArgumentNullException: Value cannot be null. Parameter name: certificate at System.IdentityModel.Tokens.X509SecurityToken..ctor(X509Certificate2 certificate, String id, Boolean clone, Boolean disposable) at Microsoft.IdentityServer.Service.Configuration.MSISSecurityTokenServiceConfiguration.Create(Boolean forSaml, Boolean forPassive) at Microsoft.IdentityServer.Service.Policy.PolicyServer.Service.ProxyPolicyServiceHost.ConfigureWIF() at Microsoft.IdentityServer.Service.SecurityTokenService.MSISConfigurableServiceHost.Configure() at Microsoft.IdentityServer.Service.Policy.PolicyServer.Service.ProxyPolicyServiceHost.Create() at Microsoft.IdentityServer.ServiceHost.STSService.StartProxyPolicyStoreService(ServiceHostManager serviceHostManager) at Microsoft.IdentityServer.ServiceHost.STSService.OnStartInternal(Boolean requestAdditionalTime)
Im ersten Schritt habe ich natürlich von der Zwischen-CA ein neues Zertifikat ausstellen lassen. Anschließend wird es in den Zertifikatspeicher der Maschine auf beiden AD FS-Servern importiert.
Das Zertifikat kann jedoch nicht über die AD FS-Benutzeroberfläche zugewiesen werden, da der Dienst nicht ausgeführt wird.
Versuchen Sie daher, ein neues Zertifikat über die Befehlszeile zuzuweisen. Lesen Sie dazu zunächst die aktiven Dienste aus.
Get-AdfsSslCertificate | fl * AcceptClientCerts : False AppId : 5d89a20c-beab-4389-9447-324788eb944a CertificateHash : 4C054BB250C4D59A0FA2BE534C7A81824CD7A8DC HostName : login.lab03.daniel.wydler.eu CtlStoreName : PortNumber : 443 AcceptClientCerts : False AppId : 5d89a20c-beab-4389-9447-324788eb944a CertificateHash : 4C054BB250C4D59A0FA2BE534C7A81824CD7A8DC HostName : localhost CtlStoreName : PortNumber : 443 AcceptClientCerts : False AppId : 5d89a20c-beab-4389-9447-324788eb944a CertificateHash : 4C054BB250C4D59A0FA2BE534C7A81824CD7A8DC HostName : certauth.login.lab03.daniel.wydler.eu CtlStoreName : PortNumber : 443 AcceptClientCerts : False AppId : 5d89a20c-beab-4389-9447-324788eb944a CertificateHash : 4C054BB250C4D59A0FA2BE534C7A81824CD7A8DC HostName : EnterpriseRegistration.lab03.daniel.wydler.eu CtlStoreName : PortNumber : 443
Die erforderlichen cmd-Befehle können mithilfe der Parameter AppId, CertificateHash und Hostname zusammengestellt werden.
netsh http update sslcert hostnameport=login.lab03.daniel.wydler.eu:443 certhash=4c054bb250c4d59a0fa2be534c7a81824cd7a8dc appid={5d89a20c-beab-4389-9447-324788eb944a} certstorename=MY netsh http update sslcert hostnameport=localhost:443 certhash=4c054bb250c4d59a0fa2be534c7a81824cd7a8dc appid={5d89a20c-beab-4389-9447-324788eb944a} certstorename=MY netsh http update sslcert hostnameport=certauth.login.lab03.daniel.wydler.eu:443 certhash=4c054bb250c4d59a0fa2be534c7a81824cd7a8dc appid={5d89a20c-beab-4389-9447-324788eb944a} certstorename=MY netsh http update sslcert hostnameport=EnterpriseRegistration.lab03.daniel.wydler.eu:443 certhash=4c054bb250c4d59a0fa2be534c7a81824cd7a8dc appid={5d89a20c-beab-4389-9447-324788eb944a} certstorename=MY
Der Wechsel des SSL-Zertifikats brachte leider keine Verbesserung. Die Fehlermeldung bleibt beim Starten des Windows-Dienstes und in der Ereignisanzeige dieselbe. 🙁
Letztlich besteht die einzige Lösung darin, Datum und Uhrzeit auf dem AD FS-Server vorübergehend zu manipulieren. Dafür habe ich einen kleinen PowerShell-Helfer entworfen.
do { Set-Date -Date "12/03/2023 12:45" Start-Service adfssrv } while ( (Get-Service -Name "adfssrv" | Select-Object -ExpandProperty Status) -ne "Running")
Datum und Uhrzeit (Zeile 2) müssen so gewählt werden, dass sie vor dem Datum des abgelaufenen Zertifikats liegen. Die Schleife endet, sobald der Active Directory Federation Services-Dienst wieder ausgeführt wird.
Der Dienst läuft wieder.
Dadurch ist die Benutzeroberfläche wieder zugänglich und die Zertifikate können geändert werden.
Nachdem allen drei Diensten ein gültiges neues Zertifikat zugewiesen wurde, kann der AD FS Windows-Dienst problemlos neu gestartet werden.
Viel Spaß beim Ausprobieren. 🙂