OpenVPN Error: CRL has expired
Für VPN-Verbindungen setzen wir fast ausschließlich auf OpenVPN.
Die Konfiguration erfolgt dabei über Puppet, bzw. dem Modul puppet-openvpn.
Über Hiera lassen sich die notwendigen Parameter leicht verwalten und so für jeden Nutzer eigene Zertifikate generieren.
Leider beschwert sich OpenVPN regelmäßig über eine ungültige CRL(=Certificate Revocation List): die CRL besitzt standardmäßig nur eine Gültigkeit von 30 Tagen, bevor diese neu generiert werden muss:
Jul 08 08:03:37 vpn ovpn-sys[2034]: TCP connection established with [AF_INET]87.x.x.x:54905
Jul 08 08:03:39 vpn ovpn-sys[2034]: 87.x.x.x:54905 VERIFY ERROR: depth=0, error=CRL has expired: C=DE, ST=Bavaria, L=Nuernberg, O=ADITSYSTEMS, CN=xxx
Jul 08 08:03:39 vpn ovpn-sys[2034]: 87.x.x.x:54905 OpenSSL: error:14089086:SSL routines:ssl3_get_client_certificate:certificate verify failed
Jul 08 08:03:39 vpn ovpn-sys[2034]: 87.x.x.x:54905 TLS_ERROR: BIO read tls_read_plaintext error
Jul 08 08:03:39 vpn ovpn-sys[2034]: 87.x.x.x:54905 TLS Error: TLS object -> incoming plaintext read error
Jul 08 08:03:39 vpn ovpn-sys[2034]: 87.x.x.x:54905 TLS Error: TLS handshake failed
Jul 08 08:03:39 vpn ovpn-sys[2034]: 87.x.x.x:54905 Fatal TLS error (check_tls_errors_co), restarting
Die manuelle Lösung:
- die dazugehörige OpenSSL-Konfigurationsdatei
/etc/openvpn/sys/easy-rsa/openssl.cnf
anpassen:default_crl_days=3650
Die CRL gilt nun 10 Jahre.
- nun die CRL tatsächlich neu erzeugen:
cd /etc/openvpn/sys/easy-rsa; . ./vars && KEY_CN='' KEY_OU='' KEY_NAME='' KEY_ALTNAMES='' openssl ca -gencrl -out /etc/openvpn/vpn/crl.pem -config openssl.cnf
Output:
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/vpn/easy-rsa/keys Using configuration from openssl.cnf
Statt die CRL jedoch manuell anzupassen, erlaubt puppet-openvpn
auch, die CRL automatisch neu zu generieren:
# @param crl_auto_renew Enables automatic renewing of crl.pem.
Der Default-Wert ist hier false
- warum, ist mir persönlich nicht ganz klar.
Wir setzen den crl_auto_renew
via Hiera nun auf true
, wodurch Puppet über einen schedule die CRL automatisch erneuert:
openvpn::servers:
sys:
country: DE
province: Bavaria
city: Nuernberg
organization: ADITSYSTEMS
email: hostmaster@aditsystems.de
server: 10.x.y.0 255.255.255.0
topology: subnet
local: 185.115.x.y
server_ipv6: 2a02:74a0:x:y::/64
dev: tun0
crl_auto_renew: true
push:
- dhcp-option DNS 10.x.y.53
Sieht im Report dann so aus:
/Stage[main]/Openvpn/Openvpn::Server[sys]/Exec[renew crl.pem on vpn]/returns executed successfully