openVPNが急につながらなくなった話。

自宅外から自宅内のサーバにアクセスする際の手段としてsshとvpnがあるが、最近はvpnで自宅ネットワークに入ることがおおい。というのも自宅にあるサーバで構築されたシステムの開発をする際、同じネットワーク内にいたほうがいろいろと作業がしやすいためである。

vpnサーバの構築にはopenVPNを使っているが、そんなopenVPNが今朝からつながらなくなった。

/etc/var/openvpn.logを見てみると以下のエラーが。

Tue Sep 27 15:36:24 2022 130.xx.xxx.xxx:61548 VERIFY ERROR: depth=0, error=CRL has expired: CN=hogehoge.

error=CRL has expiredとのこと。

実はこれでつながらなくなるのが3回目である。まあ、証明書の有効期限が切れたということなので、証明書を再発行することになる。 その手順を改めてまとめる。

そもそもどうやってopenVPNサーバを立てるか

このサイトを参考にVPNサーバを構築する。 一応、流れを説明する。

必要なソフトのインストール

  1. OpenVPNのインストール
sudo apt install openvpn
  1. Easy RSAのダウンロード
git clone https://github.com/OpenVPN/easy-rsa.git

認証鍵の生成

  1. Easy RSAディレクトリへ移動
cd ./easy-rsa/easyrsa3
  1. 初期設定
 ./easyrsa init-pki

以下のように表示されればOK

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: path/to/easy-rsa/easyrsa3/pki
  1. CA証明書の生成
./easyrsa build-ca

パスフレーズを聞かれるので、パスフレーズを入力。再入力を要求されるので入力する。

sudo cp pki/ca.crt /etc/openvpn

で生成された鍵を/etc/openvpnにコピー。

  1. サーバ証明書の生成
./easyrsa build-server-full server nopass

パスフレーズは3で入力したものと同じものを入力。 生成された鍵を/etc/openvpnにコピー

$ sudo cp pki/issued/server.crt /etc/openvpn
$ sudo cp pki/private/server.key /etc/openvpn
  1. DH鍵の生成
$ ./easyrsa gen-dh

生成された鍵をコピー

$ sudo cp pki/dh.pem /etc/openvpn
  1. クライアント証明書の生成
$ ./easyrsa gen-crl

パスフレーズを聞かれたら、CA証明書のパスフレーズを入力。 生成された鍵をまたコピー

$ sudo cp pki/crl.pem /etc/openvpn
$ sudo chmod o+r /etc/openvpn/crl.pem

OpenVPNサーバの設定

/etc/openvpn/にserver.confというファイルを作成する。以下の設定を入力する。

port   1194
proto  udp
dev    tun

ca          ca.crt
cert        server.crt
key         server.key
dh          dh.pem
crl-verify  crl.pem

ifconfig-pool-persist ipp.txt

server 10.8.0.0 255.255.255.0

push "redirect-gateway def1 bypass-dhcp"
push "route 10.8.0.0 255.255.255.0"
push "dhcp-option DNS 8.8.8.8"

client-to-client
keepalive 10 120
comp-lzo

user  nobody
group nogroup

persist-key
persist-tun

status      /var/log/openvpn-status.log
log         /var/log/openvpn.log
log-append  /var/log/openvpn.log

verb 3

クライアントの設定方法

クライアントで使う鍵を生成する必要があります。サーバ側で生成します。何故か?ca.crtをもと鍵を生成するからですね。新たに生成しないといけないのは2つだけです。しかもeasyrsaを使えばかんたんにできます。

cd easy-rsa/easyrsa3
./easyrsa build-client-full username

このコマンド一発で

username.crt
username.key

の2つが生成されます。これとca.crtをクライアント側に移すわけですね。 ubuntuでvpnを使うのはかんたん。 このサイト をもとにやれば一発。

エラーの解決方法

error=CRL has expired、つまりクライアント証明書の有効期限がきれたということ。 上記のOpenVPN設定の過程のクライアント証明書の発行

./easyrsa gen-crl

をして

$ sudo cp pki/crl.pem /etc/openvpn
$ sudo chmod o+r /etc/openvpn/crl.pem

をすれば大丈夫そう。

./easyrsa gen-crl

をしたら、パスフレーズを聞かれたので入力ししたら、

Using SSL: openssl OpenSSL 1.1.1n  15 Mar 2022
Using configuration from /home/pi/easy-rsa/easyrsa3/pki/easy-rsa-3807.qIKY9G/tmp.6cBzGu
Enter pass phrase for /home/pi/easy-rsa/easyrsa3/pki/private/ca.key:

An updated CRL has been created.
CRL file: /home/pi/easy-rsa/easyrsa3/pki/crl.pem

が出てきた。ので、コピーして、ファイルの権限を更新したら、問題なくつながるようになった。

ちなみに、クライアント証明書の有効期限はデフォルトでは180日だが、EasyRSA3の設定ファイルを変更することで任意の有効期限にすることができる。

 easyrsa3/vars.example

に、使用する証明書の有効期限を入力する欄があるので、そこを変更する。 以下のコマンドを使うことで証明書の有効期限を確認することも可能である。

openssl crl -in /etc/openvpn/crl.pem -text

出力結果はこんな感じ。

Certificate Revocation List (CRL):
        Version 2 (0x1)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = hoge
        Last Update: Sep 27 08:31:20 2022 GMT
        Next Update: Mar 26 08:31:20 2023 GMT

今後やりたいこと。

vpnクライアントからvpnサーバネットワーク内のノードにアクセスすることはできるんですよ。つまりクラインアントから接続を開始することはできる。しかし、逆はできない。俺がやりたいのは、サーバが存在しているノードからクライアントに接続すること。これができると完全に同じネットワーク内にいることになる。セキュリティー的に難しいのかな?