In meiner Testumgebung LAB03 gibt es u.a. eine ADFS Farm auf Basis von Windows Server 2019. Die Farm besteht aus zwei Nodes. Damit verbunden gibt im dem Lab auch eine separate PKI, welche die Zertifikate sowohl für die Endpunkte als auch Services (Token signing, Token decryption, Server communication) im AD FS genutzt werden.
Das bisher verwendete Zertifikat ist am 30.12.2023 abgelaufen. Dem entsprechend ist auch von Windows als ungültig markiert worden.
Beim Versuch den Dienst „Active Directory Federation Services“ (manuell) zu starten wird folgende Fehlermeldung angezeigt.
Im Event Viewer ist unter „AD FS/Admin“ das Event mit der ID 102 zu 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 ein neues Zertifikat von der Intermediate CA ausstellen lassen. Anschließend auf beiden AD FS Server in den Zertifikatsspeicher der Maschine importiert.
Allerdings kann die Zuweisung des Zertifikats nicht über die UI von AD FS erfolgen, da der Dienst nicht läuft.
Daher ein Versuch über die Kommandozeile das neue Zertifikat zuweisen. Dafür zuerst die aktiven Services auslesen.
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
Anschließend kann mit Hilfe der Parametern AppId, CertificateHash und Hostname die notwendigen cmd Befehle zusammen gebaut 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
Leider hat der Wechsel des SSL-Zertifikats keine Besserung gebracht. Die Fehlermeldung beim Start des Windows Dienstes als auch im Event Viewer bleibt die Selbe. 🙁
Abhilfe schafft schlussendlich nur die temporär Manipulation von Datum und Uhrzeit auf den AD FS Server. Dazu habe ich ein kleines PowerShell Helferlein entworfen.
do { Set-Date -Date "12/03/2023 12:45" Start-Service adfssrv } while ( (Get-Service -Name "adfssrv" | Select-Object -ExpandProperty Status) -ne "Running")
Das Datum und Uhrzeit (Zeile 2) muss so gewählt werden, dass dieses vor dem Datum des abgelaufenen Zertifikats liegen. Die Schleife endet, sobald der Service Active Directory Federation Services wieder läuft.
Der Dienst läuft nun wieder.
Damit ist auch die UI wieder erreichbar und die Zertifikate können gewechselt werden.
Sind den drei Services das neue, gültige Zertifikat zugeordnet, kann der Windows Service von AD FS wieder problemlos neu gestartet werden.
Viel Spaß beim Ausprobieren. 🙂