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

# 問題
何ヶ月も問題なくVPN接続出来ていたのに急に繋がらなくなった。そんな時はまずVPNのログを見てみる。

# 問題発見の流れ

## PiVPNの場合、以下のようなファイル構成

```bash
ls /etc/openvpn

client  crl.pem  easy-rsa  server  server.conf  update-resolv-conf
```

### server.conf の確認

`server.conf`を確認してみると

```bash
cat /etc/openvpn/server.conf | grep ^\s*log

log /var/log/openvpn.log
```
`/var/log/openvpn.log`がログなので

```bash
tail -f /var/log/openvpn.log
```
をして試しに接続してみると、

```bash
VERIFY ERROR: depth=0, error=CRL has expired: CN=xxxxxxxxxx
```
こう言うようなエラーがあった場合、今回の解決方法が使える。
このエラーの意味するところは[CRL](https://ja.wikipedia.org/wiki/%E8%A8%BC%E6%98%8E%E6%9B%B8%E5%A4%B1%E5%8A%B9%E3%83%AA%E3%82%B9%E3%83%88)が失効してて、接続が拒絶されている。

### crl.pem の失効期限の確認

いつまでの期限だったのか？を確認するには以下のように確認出来る

```bash
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の場合）

```bash
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`の変数で失効期限が設定される。

```bash
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`でデフォルトの日数を確認。

```bash
cat /etc/openvpn/easy-rsa/vars.example | grep EASYRSA_CRL_DAYS

#set_var EASYRSA_CRL_DAYS	180
```


`vars`ファイルでデフォルトを上書きした実際の設定変数が確認でき、ここに`EASYRSA_CRL_DAYS`の設定がない。

```bash
# 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`

```bash
...
...
set_var EASYRSA_CURVE      secp384r1
set_var EASYRSA_CRL_DAYS 3650 # 追記
```

### crl.pem の再生成

`vars`を変更した後に`crl.pem`の再生成を行う。

```bash
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年後に変わっている。

```bash
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`を上書きコピーする

```bash
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`に出来ているファイルをコピー

```bash
sudo cp /etc/openvpn/easy-rsa/pki/crl.pem /etc/openvpn/crl.pem
```

### openvpnを再起動

```bash
sudo systemctl restart openvpn@server.service
```

これでまた以前と同じようにVPNが繋がるようになる。