現象と原因
OpenVPN のバージョンが 2.4 になってから crl.pem の有効期限を読み込むようになったようです。このため、crl.pem を作成してから 30 日(デフォルトの CRL 有効期限)経過すると error=CRL has expired となり、全ての接続を受け付けなくなります。
CRL 有効期限経過時の OpenVPN サーバーのログは下記のようになります。
Mon Oct 23 21:27:31 2017 TLS: Initial packet from [AF_INET]xxx.xxx.xxx.xxx:xxxx, sid=xxxxxxxx xxxxxxxx
Mon Oct 23 21:27:31 2017 VERIFY ERROR: depth=0, error=CRL has expired: C=XX, ST=XXXXXXXX, L=XXXXXXXX, O=XXXXXXXX, OU=XXXXXXXX, CN=XXXXXXXX, name=XXXXXXXX, emailAddress=XXXXXXXX
Mon Oct 23 21:27:31 2017 OpenSSL: error:xxxxxxxx:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned
Mon Oct 23 21:27:31 2017 TLS_ERROR: BIO read tls_read_plaintext error
Mon Oct 23 21:27:31 2017 TLS Error: TLS object -> incoming plaintext read error
Mon Oct 23 21:27:31 2017 TLS Error: TLS handshake failed
Mon Oct 23 21:27:31 2017 SIGUSR1[soft,tls-error] received, process restarting
Mon Oct 23 21:27:31 2017 Restart pause, 300 second(s)
バージョン 2.3 までは crl.pem を扱う際に独自のライブラリを使用していましたが、バージョン 2.4 から openssl に変更されたためとのことです。
対処方法
CRL の有効期限を 10 年(任意の期間でよい)にして crl.pem を再生成することで対処することができます。この後、30 日経過しても問題なく接続できれば成功です。
/etc/openvpn/easy-rsa/openssl-1.0.0.cnf
easyrsa3 では環境変数で CRL 有効期限を設定可能ですが、easyrsa2 には存在しないため openssl 設定ファイルを編集します。easyrsa2 内に存在する openssl の設定ファイルは複数存在しますが、インストールされている OpenSSL のバージョンと同じ設定ファイルを編集します。
[root@centos ~]# vim /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
#default_crl_days= 30
default_crl_days= 3650
crl.pem の再生成
crl.pem を生成するため、ダミーの証明書を作成してそれを失効させます。そして生成された crl.pem を/ etc/openvpn にコピーして OpenVPN を再起動することで解消されます。
[root@centos ~]# /etc/openvpn/easy-rsa/build-key dummy
[root@centos ~]# /etc/openvpn/easy-rsa/revoke-full dummy
[root@centos ~]# cp /etc/openvpn/easy-rsa/key/crl.pem /etc/openvpn
[root@centos ~]# service openvpn restart
参考情報
- https://www.agilegroup.co.jp/technote/openvpn-regenerate-crl.html
- https://hacknote.jp/archives/28042/
OpenVPN CRL 有効期限が切れて接続不可となる場合の対処