Je hebt het certificaat ingetrokken, een nieuwe lijst gegenereerd, en het oude profiel brengt nog steeds een tunnel op. Aan de intrekking zelf is niets kapot: een CRL is een ondertekende verklaring dat een serienummer niet meer geldig is, en die verandert de toegang pas wanneer de component die TLS beëindigt hem laadt, voor de juiste uitgever, voordat zij de acceptatiebeslissing neemt. Daar zit het grootste deel van deze gevallen, en daarom zijn intrekking en weigering twee verschillende feiten.

Werk de vijf controles hieronder in volgorde af, en stop bij de eerste die niet klopt, want elke latere controle veronderstelt dat de eerdere waar zijn.

Controleer welke component de acceptatiebeslissing neemt

Benoem het proces dat het clientcertificaat valideert, want alleen dat proces kan een lijst handhaven. Op een OpenVPN-server is dat de daemon zelf, geconfigureerd met crl-verify. Bij ocserv is dat de regel crl in ocserv.conf. Bij strongSwan zijn de invoer de geladen CRL's samen met strictcrlpolicy. Een TLS-beëindigende proxy of appliance vóór de VPN kan de echte verificateur zijn, en als dat zo is, ziet de daemon erachter het clientcertificaat nooit.

WireGuard valt in een andere categorie. Het heeft geen certificaten en geen intrekkingslijst; een peer wordt toegelaten op zijn publieke sleutel in de configuratie, dus toegang beëindigen betekent die sleutel verwijderen. Als je in een deployment met alleen WireGuard naar een CRL zoekt, is dat mechanisme er niet.

Let ook op de valkuil aan de clientkant. Een client die weigert te verbinden omdat hij het servercertificaat niet bevalt, handhaaft de keten van de server en trekt niet zijn eigen referentie in. Een gebruikerscertificaat wordt alleen ingetrokken waar dat gebruikerscertificaat wordt gevalideerd, en dat is bijna altijd de serverkant.

Controleer voor welke uitgever de lijst is ondertekend

Een CRL geldt voor één uitgevende CA. Met een root en een intermediate komen bladcertificaten van de intermediate, dus de lijst die ertoe doet is de CRL van de intermediate; de lijst van de root zegt niets over die bladeren. Een verificateur die naar het verkeerde bestand wijst, parseert het vrolijk, vindt geen passende vermelding en accepteert alles.

Bevestig de koppeling voordat je de daemon aanraakt. De uitgever op het certificaat moet overeenkomen met het subject van de lijst:

openssl x509 -in client.crt -noout -issuer -serial
openssl crl  -in intermediate.crl -noout -issuer -lastupdate -nextupdate

Wanneer beide van dezelfde CA komen, is het serienummer dat voor het certificaat is afgedrukt de waarde die in de lijst moet staan. Komen ze niet overeen, dan heb je de verkeerde CRL of de verkeerde kopie ervan in handen.

Geldigheid hoort bij dezelfde controle. Een nextUpdate in het verleden maakt de lijst verouderd, en een verificateur die fail-closed werkt, wijst dan elke client af in plaats van alleen de ingetrokken client.

Controleer of het serienummer in de geladen kopie staat

Intrekken schrijft een vermelding in de CA-database, en opnieuw genereren schrijft een nieuw bestand. Geen van beide acties bereikt een draaiende daemon die de oude kopie bij het opstarten heeft geladen. Dump de lijst en zoek het serienummer:

openssl crl -in intermediate.crl -noout -text | grep -i -A2 'Serial Number'
openssl ca -revoke client.crt
openssl ca -gencrl -out intermediate.crl

Controleer dan hoe je implementatie het bestand oppikt. OpenVPN leest een pad dat aan crl-verify is gegeven één keer bij het opstarten, dus een nieuwe lijst vereist een herstart of een herstartsignaal; dezelfde optie die naar een map wijst, wordt bij elke verbinding opnieuw gelezen, en daarom bestaat de mapmodus. strongSwan moet zijn credentials opnieuw laden, bijvoorbeeld met swanctl --load-creds. Dat het bestand op schijf correct is en dat de verificateur het gebruikt, zijn twee verschillende feiten.

Controleer het beleid voor een ontbrekende of verlopen lijst

Dit is de beslissing die veel deployments nooit expliciet nemen, en zij bepaalt of intrekking je beschermt of iedereen buitensluit. Fail-closed betekent dat er zonder bruikbare intrekkingsinformatie een weigering volgt; fail-open betekent dat de verificateur zonder die informatie doorgaat. strongSwan biedt de keuze aan als strictcrlpolicy. OpenVPN met crl-verify weigert te starten op een bestand dat het niet kan lezen of parsen, en een verlopen lijst verschijnt als een TLS-verificatiefout over een verlopen CRL in plaats van als een stilzwijgende acceptatie.

State of the revocation dataFail-closed resultFail-open result
List missing or unreadableVerification fails, so expect an outageEvery client connects, including the revoked one
List past nextUpdateValidation errors until a fresh list is deployedOld status is trusted indefinitely
Revoked serial present in the loaded listHandshake rejected for that certificateHandshake rejected for that certificate

Welke richting je ook kiest, de automatisering telt meer dan de keuze: een taak die de CRL vóór nextUpdate opnieuw genereert, en een waarschuwing wanneer de ingezette kopie ouder wordt, houden elk beleid ervan een incident te worden. Online controleren met OCSP verplaatst de actualiteit naar een responder, maar dezelfde regel geldt, want een verificateur die niet is geconfigureerd om het antwoord te controleren, verandert niets.

Controleer de actieve sessie en dan de kopieën van de sleutel

Intrekking wordt geëvalueerd tijdens de certificaatvalidatie, die plaatsvindt bij het verbinden en bij heronderhandeling. Een bestaande sessie blijft draaien tot zij opnieuw onderhandelt, en de standaard van OpenVPN is eens per uur met reneg-sec 3600. Als de persoon nu van het netwerk af moet, beëindig dan de sessie en publiceer de lijst, en bevestig daarna dat de herverbinding wordt geweigerd.

Scheid de referentie van haar kopieën. Een profiel op één laptop verwijderen stopt een andere kopie van dezelfde privésleutel niet met authenticeren; intrekking is wat elke kopie nutteloos maakt, en pas wanneer de eerdere controles kloppen. Geef een vervangend apparaat een eigen certificaat, zodat het ene kan worden ingetrokken zonder het andere aan te raken.

Voordat je het af noemt: de validerende component is benoemd, de uitgever van de lijst komt overeen met de uitgever van het blad, het ingetrokken serienummer staat in de kopie die de daemon daadwerkelijk heeft geladen, het beleid voor ontbrekende of verlopen lijsten is bewust gekozen en bewaakt, en de actieve sessie is beëindigd in plaats van afgewacht. De formaten erachter staan in RFC 5280.

Gerelateerde artikelen