OpenVPN
PiVPN

PiVPN / openvpn で急に繋がらなくなった時に確認、解決する方法


問題

何ヶ月も問題なく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が繋がるようになる。