Verlopen OpenVPN CA certificaat, wat nu?

Bij het opzetten van een OpenVPN maak je vaak gebruik van een eigen certificaatautoriteit (CA). Bij OpenVPN gebeurt dat vaak met de EasyRSA scripts. Volg je daar de instructies, dan bouw je een CA waarvan het root-certificaat 3650 dagen geldig is, bijna 10 jaar.

Hoewel het in ICT-land niet vaak voorkomt, blijkt een OpenVPN-oplossing vaak ongemerkt jaren lang mee te gaan en zo kan het gebeuren dat op een zeker moment het niet alleen (of juist niet) het certificaat van een openvpn client is verlopen, maar dat van de CA zelf!

In deze posting bekijken we wat er dan gebeurt, en hoe dat op te lossen is. Op zich is het natuurlijk verstandig om een nieuwe CA te maken en voor alle clients nieuwe certificaten te genereren. Dat kan echter logistiek lastig zijn. In plaats daarvan is het ook mogelijk een nieuw CA certificaat te maken, dat het oude vervangt, maar dat ondertekend is met dezelfde private key.

Elk VPN-punt heeft twee certificaten: een ca.crt en een eigen certificaat. Beide hebben een geldigheidsduur, van meestal 10 jaar. In dit voorbeeld slechts 10 dagen.

Om te beginnen wil je controleren wat de geldigheidsduur van de betreffende certificaten is:

root@vpntestserver:~/testvpn/keys# openssl x509 -noout -text -in ca.crt
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 15197417357606846956 (0xd2e812913f8301ec)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=NL, ST=NH, L=Amsterdam, O=vpntesttest, OU=MyOrganizationalUnit, CN=vpntesttest CA/name=EasyRSA/emailAddress=me@myhost.example.com
Validity
Not Before: Oct 21 12:39:14 2017 GMT
Not After : Oct 31 12:39:14 2017 GMT
Subject: C=NL, ST=NH, L=Amsterdam, O=vpntesttest, OU=MyOrganizationalUnit, CN=vpntesttest CA/name=EasyRSA/emailAddress=me@myhost.example.com
Subject Public Key Info:
...

Ok, en hoe zit het dan met het client certificaat?

root@vpntestserver:~/testvpn/keys# openssl x509 -noout -text -in vpntestclient.crt
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 2 (0x2)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=NL, ST=NH, L=Amsterdam, O=vpntesttest, OU=MyOrganizationalUnit, CN=vpntesttest CA/name=EasyRSA/emailAddress=me@myhost.example.com
Validity
Not Before: Oct 26 12:51:33 2017 GMT
Not After : Nov 5 12:51:33 2017 GMT
Subject: C=NL, ST=NH, L=Amsterdam, O=vpntesttest, OU=MyOrganizationalUnit, CN=vpntestclient/name=EasyRSA/emailAddress=me@myhost.example.com
Subject Public Key Info:

Eerste hulp

Als eerste verloopt dan het CA certificaat. Dit moet vernieuwd worden en op de VPN-server en op alle VPN-clients geplaatst:

maak een CSR op basis van het huidige certficaat, met een sha256 signature:

openssl x509 -x509toreq -in ca.crt -out ca.csr -signkey ca.key -sha256

Maak een bestandje ca.conf:

req_extensions = v3_req

[x509v3]
basicConstraints=CA:TRUE
Maak nu een nieuw CA certificaat aan, behulp van het CSR uit de vorige stap, weer met een sha256 signature:
openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -extensions x509v3 -extfile ca.conf -set_serial 0xd2e812913f8301ec -out ca2017.crt -sha256

Bekijk de certificaat informatie:
openssl x509 -noout -text -in ca2017.crt
Controleer of dit certificaat correct is. Het moet in ieder geval een sectie hebben waar staat:
X509v3 Basic Constraints:
CA:TRUE

Bovendien moet serienummer gelijk zijn aan dat van het originele certificaat. Eigenlijk moet het identiek zijn, behalve de ondertekening en de geldigheidsdata.

Controleer of de uitgegeven certificaten van clients (en de vpn-server) ook met dit certificaat gecontroleerd kunnen worden, bijvoorbeeld:

openssl verify -CAfile ca2017.crt vpntestclient.crt

Fijn, dat werkt. Echter, waarschijnlijk is ook het server-certificaat aan vervanging toe, want dat is destijds vast direct met de nieuwbakken CA gemaakt. Installeer het nieuwe certificaat en maak een nieuw server-certificaat
mv keys/ca.crt keys/ca-old.crt
cp keys/ca2017.crt keys/ca.crt
. ./vars
./revoke-full vpntestserver
./build-key-server vpntestserver
openssl verify -CAfile keys/ca.crt keys/vpntestserver.crt

Nu nog even de nieuwe ca.crt en vpntestserver.crt naar de vpntestserver kopieren, en openvpn herstarten.

In tweede instantie

Hiermee zijn we er niet, want de client-certificaten zijn vast ook bijna aan vervanging toe.
. ./vars
./revoke-full vpntestclient
./sing-req vpntestclient
openvpn verify -CAfile keys/ca.crt keys/vpntestclient.crt

Hier volstaat opnieuw ondertekenen; daarmee komt er geen “server” extensie in het certificaat maar voor clients is dat niet erg.