今更感半端ないテーマですが、証明書期限切れにより思い切ってOpenVPN環境を再構築したので記録を残します。
【1】証明書の有効期限を延長する
デフォルトでは証明書の有効期限がCA証明書は3年、サーバ証明書は1年です。
これをCA証明書10年、サーバ証明書5年に延ばします
ググった結果によると、以下2ファイルを修正すればいけそうです。
- /usr/lib/ssl/misc/CA.pl
- /etc/ssl/openssl.cnf
それぞれ、念のためコピーを取ってから修正していきます。
$ cd /usr/lib/ssl/misc
$ cp -p CA.pl CA.pl.bak
$ sudo vi CA.pl
下記のところを修正します。
CADAYSがCA証明書の有効期限、DAYSがサーバ証明書の有効期限と思われます。
my $DAYS = "-days 1827"; # 5 years
my $CADAYS = "-days 3653"; # 10 years
$ cd /etc/ssl
$ cp -p openssl.cnf openssl.cnf.bak
$ sudo vi openssl.cnf
下記のところを修正します。
default_daysがサーバ証明書の有効期限と思われます。CA.plのDAYSとの関係性は不明ですが両方直しました。
default_days = 1827 # how long to certify for
【2】OpenVPNサーバのセットアップ
公式の以下のページに従って構成していきます。
https://help.ubnt.com/hc/en-us/articles/115015971688-EdgeRouter-OpenVPN-Server
【2-1】認証用の証明書の生成
rootになります。
$ sudo su
DH鍵を生成します。
# openssl dhparam -out /config/auth/dh.pem -2 2048
⇒5分くらいかかりました。
CA証明書を作成します。
# cd /usr/lib/ssl/misc
# ./CA.pl -newca
CA certificate filename (or enter to create)
⇒CA証明書を新規作成するのでENTERを押します。Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
⇒CA証明書秘密鍵に設定するパスフレーズを指定します。Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) :Chiyoda-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:hogehoge
Organizational Unit Name (eg, section) :fugafuga
Common Name (e.g. server FQDN or YOUR name) :root
Email Address :.
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password :
An optional company name :⇒証明書のパラメータを入力します。(自分しか使わないのでテキトーな値でも構わないと思います)
Certificate Details:
Validity
Not Before: Mar 18 05:22:10 2020 GMT
Not After : Mar 19 05:22:10 2030 GMT⇒有効期限10年のCA証明書が出来上がりました。
cacert.pemとcakey.pemを/config/auth/にコピーします。
# cp demoCA/cacert.pem /config/auth/
# cp demoCA/private/cakey.pem /config/auth/
サーバ証明書を作成します。
まずは証明書発行リクエストを作成。
# ./CA.pl -newreq
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
⇒サーバ証明書秘密鍵に設定するパスフレーズを指定します。(後で消してしまうので何ても良いです。)Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) :Chiyoda-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:hogehoge
Organizational Unit Name (eg, section) :fugafuga
Common Name (e.g. server FQDN or YOUR name) :server
Email Address :.⇒証明書のパラメータを入力します。
次に証明書発行リクエストに署名して、サーバ証明書を作成。
# ./CA.pl -sign
Enter pass phrase for ./demoCA/private/cakey.pem:
⇒CA証明書秘密鍵のパスフレーズを入力します。Certificate Details:
Validity
Not Before: Mar 18 06:00:14 2020 GMT
Not After : Mar 19 06:00:14 2025 GMT⇒有効期限5年のサーバ証明書であることが確認できます。
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
サーバ証明書と鍵ファイルをリネームして/config/auth/にコピーします。
# mv newcert.pem /config/auth/server.pem
# mv newkey.pem /config/auth/server.key
クライアント証明書を作成します
やってることはサーバ証明書と全く同じです。
証明書発行リクエストを作成するときのCommon Nameと、サーバ証明書と鍵ファイルをリネームするときの名前が違うだけ。
# ./CA.pl -newreq
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
⇒サーバ証明書秘密鍵に設定するパスフレーズを指定します。(後で消してしまうので何ても良いです。)Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) :Chiyoda-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:hogehoge
Organizational Unit Name (eg, section) :fugafuga
Common Name (e.g. server FQDN or YOUR name) :client1
Email Address :.
# ./CA.pl -sign
Enter pass phrase for ./demoCA/private/cakey.pem:
⇒CA証明書秘密鍵のパスフレーズを入力します。Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
# mv newcert.pem /config/auth/client1.pem
# mv newkey.pem /config/auth/client1.key
サーバ証明書、クライアント証明書の鍵ファイルのパスフレーズを消去します。
# openssl rsa -in /config/auth/server.key -outt /config/auth/server-no-pass.key
Enter pass phrase for /config/auth/server.key:
⇒サーバ証明書秘密鍵のパスフレーズを入力します。# openssl rsa -in /config/auth/client1.key -oout /config/auth/client1. -no-pass.key
Enter pass phrase for /config/auth/client1.key:
⇒クライアント証明書秘密鍵のパスフレーズを入力します。
鍵ファイルをパスフレーズなし版で上書きします。
# mv /config/auth/server-no-pass.key /config/aauth/server.key
# mv /config/auth/client1-no-pass.key /configg/auth/client1.key
クライアント証明書の鍵ファイルに非rootユーザの読み取り権限を付けます。
# chmod 644 /config/auth/er-x-client01.key
最終的に、/config/authディレクトリ内はこのようになります。
# ls -l /config/auth
total 40
-rw-r--r-- 1 root vyattacf 4398 Mar 18 05:56 cacert.pem
-rw------- 1 root vyattacf 1854 Mar 18 05:56 cakey.pem
-rw-r--r-- 1 root vyattacf 424 Mar 18 05:12 dh.pem
-rw-r--r-- 1 root vyattacf 1675 Mar 18 06:27 client1.key
-rw-r--r-- 1 root root 4576 Mar 18 06:04 client1.pem
-rw------- 1 root vyattacf 1675 Mar 18 06:26 server.key
-rw-r--r-- 1 root root 4570 Mar 18 06:00 server.pem
rootから抜けて通常ユーザに戻ります。
# exit
ここまで出来たら、SCPなどを使って以下のファイルをEdgeRouterからPCにダウンロードしておいてください。
- cacert.pem
- client1.pem
- client1.key
【2-2】EdgeRouter側の設定
configモードに入ります。
以降、ENTERを押すたびに「[edit]」と表示されますが本文中では省略します。
$ configure
WAN_LOCALファイアウォールポリシーを設定します。
# set firewall name WAN_LOCAL rule 30 action accept
# set firewall name WAN_LOCAL rule 30 description openvpn
# set firewall name WAN_LOCAL rule 30 destination port 1194
# set firewall name WAN_LOCAL rule 30 protocol udp
バーチャルトンネルインターフェースvtun0 を設定します。
# set interfaces openvpn vtun0 mode server
# set interfaces openvpn vtun0 server subnet 192.168.100.0/24
# set interfaces openvpn vtun0 server push-route 192.168.1.0/24
# set interfaces openvpn vtun0 server name-server 192.168.1.1
#2022/01/26追記
# set interfaces openvpn vtun0 server subnet 192.168.100.0/24
で指定したセグメントから、VPNクライアントへIPアドレスが割り当てられます。
# set interfaces openvpn vtun0 server push-route 192.168.1.0/24
で指定したセグメントへの通信が、VPNを通るようになります。
証明書、鍵ファイル、DHファイルをvtun0 に関連付けます。
# set interfaces openvpn vtun0 tls ca-cert-file /config/auth/cacert.pem
# set interfaces openvpn vtun0 tls cert-file /config/auth/server.pem
# set interfaces openvpn vtun0 tls key-file /config/auth/server.key
# set interfaces openvpn vtun0 tls dh-file /config/auth/dh.pem
DNSフォワーディングインターフェースリストにvtun0 を追加します。
# set service dns forwarding listen-on vtun0
変更をコミットして、configモードから抜けます。
# commit
# save
# exit
【3】OpenVPN用のプロファイルを作成する
Android向けです。他機種では確認してません。
以下のテキストを client1.ovpn などの名前で保存します。
client
dev tun
proto udp
remote インターネット側からアクセス可能なIPアドレスまたはホスト名 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca cacert.pem
cert client1.pem
key client1.key
verb 3
さらに
redirect-gateway def1
を追加すると、push-routeで指定したセグメントだけでなくすべての通信がVPN経由になります。
以下のファイルをまとめてAndroid端末にコピーし、「OpenVPN Connect」アプリでプロファイルを読み込みます。
- client1.ovpn
- cacert.pem
- client1.pem
- client1.key
以上!