Kort svar
"Certificate has expired" betyder at certifikatets notAfter-dato er passeret. Et certifikat er kun gyldigt i et fast vindue (i dag typisk 90 dage til ét år for offentlige certifikater), og efter notAfter afviser klienter det. Løsningen er at forny certifikatet og geninstallere det — men husk at genstarte tjenesten og at tjekke om en intermediate også er udløbet.
Bekræft det først
Gæt ikke — læs datoerne direkte fra serveren:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \ | openssl x509 -noout -dates
Outputtet viser notBefore og notAfter. Er notAfter i fortiden, er certifikatet udløbet. For en lokal fil:
openssl x509 -in certificate.crt -noout -enddate
Hvorfor udløber certifikater overhovedet?
Korte levetider begrænser skaden hvis en privat nøgle lækker, og tvinger nøgler og kryptografi til at blive fornyet. Branchen bevæger sig mod stadig kortere levetider, hvilket gør manuel fornyelse uholdbar. Vi har en dedikeret artikel om hvorfor certifikater udløber.
Sådan fixer du det
- Forny certifikatet hos din CA eller via ACME (Let's Encrypt, ZeroSSL m.fl.).
- Installer det nye certifikat inklusive den fulde certifikat-kæde (fullchain), ikke kun leaf-certifikatet.
- Genstart eller reload tjenesten — mange handshake-fejl efter en fornyelse skyldes at nginx/Apache/load balanceren stadig holder det gamle certifikat i hukommelsen.
- Verificér udefra med
openssl s_client-kommandoen ovenfor.
Fælden: en udløbet intermediate
Dit leaf-certifikat kan være helt gyldigt, mens en intermediate i kæden er udløbet — og så fejler hele kæden alligevel. Det skete i flere store hændelser, hvor en CA's intermediate udløb. Tjek hele kæden, ikke kun leaf'en:
openssl s_client -connect example.com:443 -servername example.com -showcerts 2>/dev/null \ | openssl crl2pkcs7 -nocrl -certfile /dev/stdin \ | openssl pkcs7 -print_certs -noout -text | grep -E "Subject:|Not After"
Ser du en Not After i fortiden på et hvilket som helst certifikat i kæden, er det den skyldige.
Den egentlige løsning: stop med at lade dem udløbe
Et udløbet certifikat er aldrig en overraskelse — datoen står i certifikatet fra dag ét. Problemet er manglende overblik: ingen vidste at netop det certifikat eksisterede, eller hvem der ejede det. CertControl opdager alle jeres certifikater (også dem ingen huskede), sporer udløbsdatoer og advarer i god tid via mail, Slack eller webhook — så fornyelsen sker før fejlen rammer.
Ofte stillede spørgsmål
Hvor hurtigt virker siden igen efter fornyelse?
Så snart det nye certifikat er installeret og tjenesten er reloadet. Der er ingen propagationstid som ved DNS — men husk at reloade nginx/Apache, ellers serveres det gamle certifikat stadig fra hukommelsen.
Kan jeg bare flytte uret tilbage for at undgå fejlen?
Nej. Det "løser" kun fejlen på din egen maskine og skaber nye problemer. Klienter verificerer mod deres eget ur, så alle andre ser stadig et udløbet certifikat. Forny i stedet.
Hvorfor fejler det selvom jeg lige har fornyet?
Tre typiske årsager: tjenesten er ikke reloadet, du installerede kun leaf-certifikatet uden kæden, eller en intermediate i kæden er selv udløbet.
Hvad er forskellen på "expired" og "not yet valid"?
"Expired" betyder notAfter er passeret. "Not yet valid" betyder notBefore ligger i fremtiden — ofte fordi serverens ur går forkert.