クライアント証明書の作成 / AlmaLinux9.4 on さくらのVPS

アフィリエイト広告を利用しています

このページの内容が役に立ったら X (旧twitter) でフォローして頂けると励みになります
挨拶や報告は無しで大丈夫です

さくらのVPS 2G にAlmaLinux9.4をインストールした覚書です。

前回の記事まででOpenVPNを使用するためのサーバ側の準備は整いました
ここからはクライアント側の準備を進めていきます。

クライアント側は、クライアントごとに異なる証明書を用意したほうが良いです。
そのため、クライアントの数だけ本記事の内容を繰り返すことになります。

なお本番環境で利用される場合はここにある内容だけを鵜呑みにせずセキュリティ専門家に相談されることをお勧めします。

環境

実施日2024-06-20
サーバさくらのVPS 2G
OSAlmaLinux9.4
cat /etc/redhat-release
AlmaLinux release 9.4 (Seafoam Ocelot)

クライアント証明書を作成

「./easyrsa build-client-full」を使用する方法もあります。
「build-client-full」は、下記の2つの手順をまとめて実行するためのコマンドです。

ここでは例として、Core i9 の windows11をクライアントマシンとして接続するケースで進めていきます。
ということで、Core i9 の windows11 なので「win11_i9」という名前にします。
※名前はなんでも良いです。

下記「win11_i9」の個所はご自身で設定した名前に読みかえて進めてください。
コマンド的には最初に「VPN_CLIENT_NAME」という変数に入れて、以降のコマンドでは「win11_i9」を意識しないで良いようにしています。

# VPNサーバのドメイン
VPN_DOMAIN=vpn.example.cpm

# VPNで使用するポート
VPN_PORT=1194

# クライアント名
VPN_CLIENT_NAME=win11_i9

# クライアントのOPVNパス
VPN_CLIENT_OVPN_PATH=/etc/openvpn/client/$VPN_CLIENT_NAME.ovpn

# クライアント向けファイルを転送するために置くディレクトリ
VPN_USER_DIR=/home/shinohara/openvpn_${VPN_DOMAIN}_${VPN_CLIENT_NAME}
cd /etc/openvpn/easy-rsa
./easyrsa --vars=pki/vars gen-req $VPN_CLIENT_NAME nopass

Common Name にはサーバー名(ドメイン)を入力します。

作成に成功すると次のように表示されます。
最終行に書かれているパスにファイルが作成されています。

ファイル名はクライアント名で指定した名前が使われます。

/etc/openvpn/easy-rsa/pki/reqs/win11_i9.req
/etc/openvpn/easy-rsa/pki/private/win11_i9.key
./easyrsa --vars=pki/vars sign-req client $VPN_CLIENT_NAME

Confirm request details: は「yes」で継続します。

最初の方で設定したパスフレーズを入力します。

作成に成功すると次のように表示されます。
最終行に書かれているパスにファイルが作成されています。

/etc/openvpn/easy-rsa/pki/issued/win11_i9.crt

証明書をコピーする

ls -la /etc/openvpn/client/
cp pki/private/$VPN_CLIENT_NAME.key /etc/openvpn/client/
cp pki/issued/$VPN_CLIENT_NAME.crt /etc/openvpn/client/
cp pki/ca.crt /etc/openvpn/client/

クライアントの設定ファイルを作成

クライアントごとの設定ファイルを作成します。

サンプルからファイルをコピー

cp /usr/share/doc/openvpn/sample/sample-config-files/client.conf $VPN_CLIENT_OVPN_PATH

ここでは開いて確認するだけ

vi $VPN_CLIENT_OVPN_PATH

書き換えはコマンドにしました。
同じことを手動で行っても構いません。

sed -i "s/remote my-server-1 1194/remote $VPN_DOMAIN $VPN_PORT/g" $VPN_CLIENT_OVPN_PATH
sed -i "s/ca ca.crt/ca \/etc\/openvpn\/client\/ca.crt/g" $VPN_CLIENT_OVPN_PATH
sed -i "s/cert client.crt/cert \/etc\/openvpn\/client\/$VPN_CLIENT_NAME.crt/g" $VPN_CLIENT_OVPN_PATH
sed -i "s/key client.key/key \/etc\/openvpn\/client\/$VPN_CLIENT_NAME.key/g" $VPN_CLIENT_OVPN_PATH
sed -i "s/tls-auth ta.key 1/tls-auth \/etc\/openvpn\/ta.key 1/g" $VPN_CLIENT_OVPN_PATH

クライアント用のファイルを1つにまとめる

クライアントに渡すファイルは次の4つになります。

  • クライアント設定ファイル (クライアント名.ovpn)
  • CA証明書 (ca.crt)
  • クライアント証明書 (クライアント名.crt)
  • クライアントキー (クライアント名.key)
  • TLS認証キー(ta.key)

これらをそのまま提供しても良いのですが、1つのファイルにまとめる方法もあります。

cp $VPN_CLIENT_OVPN_PATH /etc/openvpn/client/$VPN_CLIENT_NAME-all.ovpn
{
  echo "<ca>"
  cat /etc/openvpn/client/ca.crt
  echo "</ca>"

  echo "<cert>"
  cat /etc/openvpn/client/$VPN_CLIENT_NAME.crt
  echo "</cert>"

  echo "<key>"
  cat /etc/openvpn/client/$VPN_CLIENT_NAME.key
  echo "</key>"

  echo "<tls-auth>"
  cat /etc/openvpn/ta.key
  echo "</tls-auth>"
} >> /etc/openvpn/client/$VPN_CLIENT_NAME-all.ovpn

クライアントにファイルを送る

前の項目で作成したファイルをクライアントに送ります。

USBやメールなど送る方法は自由です。
※セキュリティ的に考慮したうえで

下記はユーザーディレクトリにコピーする例です。
その後、shinohara ユーザーでSSHして取得する流れを想定しています。

▼1つにまとめない場合

mkdir $VPN_USER_DIR
cp $VPN_CLIENT_OVPN_PATH $VPN_USER_DIR
cp /etc/openvpn/client/ca.crt $VPN_USER_DIR
cp /etc/openvpn/client/$VPN_CLIENT_NAME.crt $VPN_USER_DIR
cp /etc/openvpn/client/$VPN_CLIENT_NAME.key $VPN_USER_DIR
cp /etc/openvpn/ta.key $VPN_USER_DIR
# オーナー名は変更してください
chown -R shinohara:shinohara $VPN_USER_DIR

▼1つにまとめた場合

cp /etc/openvpn/client/$VPN_CLIENT_NAME-all.ovpn /home/shinohara/

次のページでは、実際にクライアント側からの接続を行う方法になります