openvpnで CRL has expired が出た場合の対応

easyrsa3で構築したOpenVPN2.3系を使っていて問題なかったところに、 2.4系にアップデートしたら突如使えなくなったときの話です。

/var/log/openvpn.logにこんなんが出ます。

TLS: Initial packet from [AF_INET]xxx.xxx.xxx.xxx:xxxxxx, sid=xxxxxxxx xxxxxxxx
VERIFY ERROR: depth=0, error=CRL has expired: CN=xxxxxxxxxx
OpenSSL: error:140890B2:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned
TLS_ERROR: BIO read tls_read_plaintext error
TLS Error: TLS object -> incoming plaintext read error
TLS Error: TLS handshake failed
Fatal TLS error (check_tls_errors_co), restarting

アップデートで設定は全く変えていないのに、 2.3ではOK、2.4ではNGになるのですが、原因は以下のようです。

1. easyrsa3で作成した crl.pem はデフォルトで有効期限が180日に設定されており、期限が切れていた。がopenvpnはcrl.pemの期限を見ていなかった。
2. OpenVPNの2.3から2.4に変わったときにcrl.pemを扱うライブラリが独自のものからopensslに変更された影響で期限を見るようになり、接続できなくなった

参考: https://bugzilla.redhat.com/show_bug.cgi?id=1451696

ということで処理が正常化したらエラーが出たということのようです。

crl.pem を作成するときに期限を3650日にして再生成すればOKです。
なお、crl.pemはユーザー無効化リストですので、こちらを再生成しても既存のユーザーに影響はありません。

cd /path/to/easyrsa3
cp -p vars.example vars
vim vars
---
set_var EASYRSA_CRL_DAYS    3650
---

./easyrsa gen-crl

で crl.pem を再生成できます。 crl.pemの期限は以下のコマンドで見れます。

openssl crl -in crl.pem -text