2026年8月12日
2026年8月12日
OpenVPNの鍵管理の方法|Easy-RSAでの証明書発行・失効(CRL)・期限管理の手順
OpenVPN の鍵管理は、「認証局(CA)の秘密鍵を守る」「利用者ごとに証明書を発行する」「辞めた人や紛失した端末の証明書を失効させる」「期限切れの前に更新する」の4つが柱です。この記事では、OpenVPN 標準の証明書管理ツール Easy-RSA 3 を使って、発行から失効、期限の確認までを手順として説明し、運用でつまずきやすい点(CRL の期限切れで全員がつながらなくなる、など)も合わせて扱います。
コマンドは Linux サーバー上で Easy-RSA 3 系を使う例です。Easy-RSA は版によってサブコマンドや既定値が変わることがあるため(2026年10月現在)、作業前に ./easyrsa help で手元の版の説明を確認してください。pki ディレクトリを触る前には、ディレクトリごとバックアップを取ります。
OpenVPNで扱う鍵と証明書
OpenVPN(証明書認証の構成)で登場するファイルは次のとおりです。
- CA 証明書(ca.crt):サーバーとクライアントの両方に配る。公開してよい
- CA の秘密鍵(ca.key):すべての証明書の発行元。漏れると誰でも正規の証明書を作れてしまうため、最も厳重に扱う
- サーバー証明書と秘密鍵:VPN サーバーだけが持つ
- クライアント証明書と秘密鍵:利用者(または端末)ごとに1組
- CRL(失効リスト、crl.pem):失効させた証明書の一覧。サーバーが接続のたびに照合する
- tls-crypt 用の共有鍵:TLS のやり取り自体を暗号化し、無関係な第三者からの接続試行を最初の段階で捨てる
考え方の基本は「1人1証明書」です。複数人で同じ証明書を使い回すと、1人が退職したときに全員分を作り直すことになり、誰が接続したかのログも追えなくなります。
CAを用意する
CA は VPN サーバーとは別の、普段ネットワークにつながない端末で管理するのが理想です。難しい場合でも、CA の秘密鍵にはパスフレーズをかけ、root 以外が読めない権限にします。
# Easy-RSA を展開したディレクトリで実行
./easyrsa init-pki
./easyrsa build-ca # CA 秘密鍵のパスフレーズを聞かれる
build-ca に nopass を付けるとパスフレーズなしで作れますが、CA では避けてください。署名のたびに入力する手間は、漏えい時の被害に比べれば小さなものです。
サーバー証明書と tls-crypt 鍵を作る
サーバー用の鍵ペアを作り、CA で署名します。サーバーは無人で起動する必要があるため、サーバーの秘密鍵は nopass が一般的です。その分、ファイルの権限で守ります。
./easyrsa gen-req server nopass
./easyrsa sign-req server server
tls-crypt 用の共有鍵は OpenVPN 本体で作ります。OpenVPN 2.5 以降では次の書式です(古い版では --genkey --secret という書式でした)。
openvpn --genkey tls-crypt /etc/openvpn/server/tc.key
サーバー設定ファイルでは、作ったファイルを次のように指定します。remote-cert-tls client は、クライアント用として発行された証明書だけを受け付ける指定です。
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
tls-crypt /etc/openvpn/server/tc.key
crl-verify /etc/openvpn/server/crl.pem
remote-cert-tls client
dh none
dh none は楕円曲線の鍵交換(ECDHE)だけを使う指定で、OpenVPN 2.4 以降で使えます。古いクライアントが残っている環境では、./easyrsa gen-dh で DH パラメーターを作って dh に指定する方法もあります。
クライアント証明書を発行する
利用者ごとに名前(CN)を決めて発行します。名前は「誰の、どの端末か」が分かるものにしておくと、失効させるときに迷いません。
./easyrsa gen-req tanaka-laptop nopass
./easyrsa sign-req client tanaka-laptop
より安全なのは、秘密鍵を利用者の端末で作ってもらい、署名要求(.req)だけを受け取る方法です。秘密鍵がネットワークを一度も流れません。
# 利用者の端末側で(Easy-RSA を入れた環境)
./easyrsa gen-req tanaka-laptop
# CA 側で取り込んで署名
./easyrsa import-req /path/to/tanaka-laptop.req tanaka-laptop
./easyrsa sign-req client tanaka-laptop
管理者が秘密鍵ごと作って .ovpn ファイルに埋め込み配る運用もよく見られます。その場合、.ovpn ファイルは「パスワードと同じ扱いの秘密情報」です。メールやチャットに添付せず、受け渡し後は配布元のコピーを消し、受け取った側にも端末外へコピーしないよう伝えます。クライアントの秘密鍵にパスフレーズを付けておくと、ファイルが漏れたときの被害を抑えられます。
失効させる(退職・端末紛失のとき)
失効は「revoke して CRL を作り直し、サーバーに置く」までが1セットです。revoke しただけでは、サーバーは何も知りません。
./easyrsa revoke tanaka-laptop
./easyrsa gen-crl
sudo cp pki/crl.pem /etc/openvpn/server/crl.pem
sudo chmod 644 /etc/openvpn/server/crl.pem
OpenVPN は起動後に権限を落として動かす設定(user nobody など)が多いため、CRL ファイルがそのユーザーから読めないと、接続がすべて拒否されることがあります。権限を 644 にしているのはそのためです。CRL ファイルの更新は、多くの版で再起動なしに新しい接続から反映されますが、念のため失効させた証明書で接続できないことを確かめてください。
すでに接続中のセッションは、CRL を更新しても即座には切れない場合があります。急ぐときは、管理インターフェースから該当クライアントを切断するか、サービスを再起動します。
期限を管理する
見落とされやすいのが CRL 自体の有効期限です。Easy-RSA の既定では CRL の有効期間は 180 日前後に設定されており(既定値は版や vars ファイルで異なります)、期限が切れた CRL を指定したままにすると、サーバーは全クライアントの接続を拒否します。「ある日突然、全員つながらなくなった」という障害の典型的な原因です。
失効させる人がいなくても、定期的に gen-crl を実行してサーバーに置き直してください。期限は次のコマンドで確認できます。
# CRL の次回更新期限
openssl crl -in /etc/openvpn/server/crl.pem -noout -nextupdate
# 各証明書の期限
openssl x509 -in pki/issued/tanaka-laptop.crt -noout -subject -enddate
発行済み証明書の一覧は pki/index.txt にあります。行頭が V なら有効、R なら失効、E なら期限切れです。この一覧から期限が近いものを抜き出し、監視やカレンダーに登録しておくと更新漏れを防げます。
証明書の更新方法は、Easy-RSA の版によって renew サブコマンドの仕様が変わってきた経緯があります。版に左右されにくい手順としては、新しい名前(例:tanaka-laptop-2027)で発行して配布し、利用者が切り替えたのを確認してから古い証明書を失効させる方法が分かりやすいです。
CA 証明書の期限(既定では10年程度)が切れると、すべての証明書が使えなくなります。CA の作り直しは全員の再配布を伴うため、期限の数か月前から新旧の CA を併用する移行計画を立ててください。
一つの鍵を共有しない運用のために
tls-crypt の共有鍵は全員に同じものを配るため、1人分の .ovpn が漏れると、その鍵で最初の段階を通過できるようになります(証明書がなければ接続はできません)。利用者が多い環境では、OpenVPN 2.5 以降で使える tls-crypt-v2 を使うと、クライアントごとに異なる鍵を配れます。導入する場合はサーバーとクライアントの両方の版が対応しているかを先に確認してください。
まとめ
- CA の秘密鍵はパスフレーズをかけ、できればサーバーと別の端末で保管する
- 証明書は1人(1端末)1枚。秘密鍵は利用者側で作って .req だけ受け取るのが理想
- 失効は revoke → gen-crl → サーバーへ配置までがセット。CRL の権限にも注意
- CRL には期限がある。切れると全員が接続できなくなるため、定期的に作り直す
- 証明書と CA の期限は openssl と index.txt で確認し、更新を計画的に行う