Anton Dollmaier

Anton Dollmaier


OpenVPN Error: CRL has expired

08 Jul 2019 »

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
© Anton Dollmaier