問題
何ヶ月も問題なくVPN接続出来ていたのに急に繋がらなくなった。そんな時はまずVPNのログを見てみる。
問題発見の流れ
PiVPNの場合、以下のようなファイル構成
ls /etc/openvpn
client crl.pem easy-rsa server server.conf update-resolv-conf
server.conf の確認
server.conf
を確認してみると
cat /etc/openvpn/server.conf | grep ^\s*log
log /var/log/openvpn.log
/var/log/openvpn.log
がログなので
tail -f /var/log/openvpn.log
をして試しに接続してみると、
VERIFY ERROR: depth=0, error=CRL has expired: CN=xxxxxxxxxx
こう言うようなエラーがあった場合、今回の解決方法が使える。
このエラーの意味するところはCRLが失効してて、接続が拒絶されている。
crl.pem の失効期限の確認
いつまでの期限だったのか?を確認するには以下のように確認出来る
sudo openssl crl -in /etc/openvpn/crl.pem -text
Certificate Revocation List (CRL):
Version 2 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: /CN=ChangeMe
Last Update: Feb 5 12:20:56 2018 GMT
Next Update: Aug 2 12:20:56 2018 GMT
Next Update: Aug 2 12:20:56 2018 GMT
以降は繋がらなくなる。
解決方法
PiVPNの場合はデフォルト配置されている/etc/openvpn/crl.pem
を更新する必要がある。この際、デフォルトの失効期限(180日)を延長変更しておけば、毎度毎度crl.pem
の更新が必要なくなる。
easy-rsaのファイル一覧(PiVPNの場合)
ls /etc/openvpn/easy-rsa
ChangeLog COPYING.md doc easyrsa gpl-2.0.txt openssl-1.0.cnf
pki README.quickstart.md vars vars.example x509-types
失効期限の確認
$ENV::EASYRSA_CRL_DAYS
の変数で失効期限が設定される。
cat /etc/openvpn/easy-rsa/openssl-1.0.cnf | grep EASYRSA_CRL_DAYS
default_crl_days= $ENV::EASYRSA_CRL_DAYS # how long before next CRL
vars.example
でデフォルトの日数を確認。
cat /etc/openvpn/easy-rsa/vars.example | grep EASYRSA_CRL_DAYS
# set_var EASYRSA_CRL_DAYS 180
vars
ファイルでデフォルトを上書きした実際の設定変数が確認でき、ここにEASYRSA_CRL_DAYS
の設定がない。
# easy-rsaの場所(PiVPNの場合)
cat /etc/openvpn/easy-rsa/vars
if [ -z "$EASYRSA_CALLER" ]; then
echo "Nope." >&2
return 1
fi
set_var EASYRSA "/etc/openvpn/easy-rsa"
set_var EASYRSA_PKI "$EASYRSA/pki"
set_var EASYRSA_KEY_SIZE 2048
set_var EASYRSA_ALGO rsa
set_var EASYRSA_CURVE secp384r1
失効期限の変更
vars
の末尾にEASYRSA_CRL_DAYS
を追加してデフォルトの日数を変更する。
例えばこの先10年 set_var EASYRSA_CRL_DAYS 3650
...
...
set_var EASYRSA_CURVE secp384r1
set_var EASYRSA_CRL_DAYS 3650 # 追記
crl.pem の再生成
vars
を変更した後にcrl.pem
の再生成を行う。
sudo /etc/openvpn/easy-rsa/easyrsa gen-crl
Note: using Easy-RSA configuration from: /etc/openvpn/easy-rsa/vars
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.cnf
An updated CRL has been created.
CRL file: /etc/openvpn/easy-rsa/pki/crl.pem
確認すると確かに10年後に変わっている。
sudo openssl crl -in /etc/openvpn/easy-rsa/pki/crl.pem -text
Certificate Revocation List (CRL):
Version 2 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: /CN=ChangeMe
Last Update: Aug 5 12:20:56 2018 GMT
Next Update: Aug 2 12:20:56 2028 GMT
ここで、生成された場所が/etc/openvpn/server.conf
で指定されている場所と違うと思うので、指定場所を確認の上、crl.pem
を上書きコピーする
cat /etc/openvpn/server.conf | grep ^\s*crl-verify
crl-verify /etc/openvpn/crl.pem
/etc/openvpn/crl.pem
なので、/etc/openvpn/easy-rsa/pki/crl.pem
に出来ているファイルをコピー
sudo cp /etc/openvpn/easy-rsa/pki/crl.pem /etc/openvpn/crl.pem
openvpnを再起動
sudo systemctl restart openvpn@server.service
これでまた以前と同じようにVPNが繋がるようになる。