VyOS 1.5のIKEv2リモートアクセスVPNサーバをクライアント証明書認証にする

こんばんは。tukapiyoです。

VyOSでIKEv2リモートアクセスVPNを設定していましたが、認証方式をeap-mschapv2からeap-tlsのクライアント証明書認証に切り替えましたので、その方法をメモしておきます。

環境

  • VyOS 1.5 2026.03
  • Stream版なので仕様が変更になったり、バグが含まれる可能性があります。

設定方針

  • ユーザ認証にクライアント証明書を使う
    • クライアント証明書は、VyOSをCAとして発行する
  • サーバ認証にサーバ証明書を使う
    • サーバ証明書は、Google Public CAで発行する
    • このためIPアドレスではなく、FQDNでのVPN接続を前提とします
  • Windowsは標準のVPN設定画面から設定できるようにする
  • AndroidはStrongSwanクライアントアプリから接続できるようにする

補足

  • サーバ証明書はLet’s Encryptではなく、Google Public CAの証明書を使用(関連記事参照)
    ※最新バージョンでは改修されているかもしれませんが、このバージョンのVyOSではチェーンが深い証明書を検証できない問題があります。

VyOS上にCAを作成

これまで私の環境ではCAは外部の商用CAでしたので、VyOSに新しくプライベートCAを作成します。
今回、CA名としてPrivateCAという名前で作成することとします。

$ configure
# run generate pki ca install PrivateCA
Enter private key type: [rsa, dsa, ec] (Default: rsa) ec
Enter private key bits: (Default: 256)
Enter country code: (Default: GB) JP
Enter state: (Default: Some-State) <都道府県>
Enter locality: (Default: Some-City) <市区町村>
Enter organization name: (Default: VyOS) <適当な組織名>
Enter common name: (Default: vyos.io) <適当なコモンネーム>
Enter how many days certificate will be valid: (Default: 1825) <CA証明書の有効期限>
Note: If you plan to use the generated key on this router, do not encrypt the private key.
Do you want to encrypt the private key with a passphrase? [y/N](そのままEnterキーを押下)
2 value(s) installed. Use "compare" to see the pending changes, and "commit" to apply.

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

引き続きVyOS上でクライアント証明書を発行していきます。

クライアント証明書の作成については、Android用とWindows用で手順が異なります。
Windows用を使ってAndroidでも認証できるかもしれませんが今回は別々に作成することとします。

Android用

クライアント証明書は、certificate typeにclientを設定します。
今回、端末名としてAndroidという名前で作成することとします。

# run generate pki certificate sign PrivateCA install Android
Do you already have a certificate request? [y/N]
Enter private key type: [rsa, dsa, ec] (Default: rsa) ec
Enter private key bits: (Default: 256)
Enter country code: (Default: GB) JP
Enter state: (Default: Some-State) <都道府県>
Enter locality: (Default: Some-City) <市区町村>
Enter organization name: (Default: VyOS) <適当な組織名>
Enter common name: (Default: vyos.io) <適当な端末名>
Do you want to configure Subject Alternative Names? [y/N](そのままEnterキーを押下)
Enter how many days certificate will be valid: (Default: 365) <クライアント証明書の有効期限>
Enter certificate type: (client, server) (Default: server) client
Note: If you plan to use the generated key on this router, do not encrypt the private key.
Do you want to encrypt the private key with a passphrase? [y/N](そのままEnterキーを押下)
2 value(s) installed. Use "compare" to see the pending changes, and "commit" to apply.

Windows用

クライアント証明書は、certificate typeにclientを設定します。
今回、端末名としてWindowsという名前で作成することとします。

Windows向けの注意として、CNのほかにSANの設定が必要です。
CNのフォーマットは、user@host.domainの形式でユーザ及び端末を特定できるようにします。
SANのフォーマットは、rfc822:user@host.domainの形式とします。

# run generate pki certificate sign PrivateCA install Windows
Do you already have a certificate request? [y/N]
Enter private key type: [rsa, dsa, ec] (Default: rsa) ec
Enter private key bits: (Default: 256)
Enter country code: (Default: GB) JP
Enter state: (Default: Some-State) <都道府県>
Enter locality: (Default: Some-City) <市区町村>
Enter organization name: (Default: VyOS) <適当な組織名>
Enter common name: (Default: vyos.io) user@host.domain
Do you want to configure Subject Alternative Names? [y/N] y
Enter alternative names in a comma separate list, example: ipv4:1.1.1.1,ipv6:fe80::1,dns:vyos.net,rfc822:user@vyos.net
Enter Subject Alternative Names: rfc822:user@host.domain
Enter how many days certificate will be valid: (Default: 365) <クライアント証明書の有効期限>
Enter certificate type: (client, server) (Default: server) client
Note: If you plan to use the generated key on this router, do not encrypt the private key.
Do you want to encrypt the private key with a passphrase? [y/N](そのままEnterキーを押下)
2 value(s) installed. Use "compare" to see the pending changes, and "commit" to apply.

IKEv2の設定変更

VyOSのリモートアクセスVPNの設定の変更も必要ですね。

元々はeap-mschapv2によるID/PASS認証でした。
これをeap-tlsによるクライアント証明書認証に変更していきます。

変更点だけ示します。

  • vpn ipsec remote-access connection <CONNECTION> authentication client-mode
    eap-mschapv2からeap-tlsへ変更
  • vpn ipsec remote-access connection <CONNECTION> authentication local-users
    削除
  • vpn ipsec remote-access connection <CONNECTION> authentication x509 ca-certificate
    PrivateCAを追加(Google Public CAと2つ並びます)

インストール用クライアント証明書の作成

端末に導入するクライアント証明書を、証明書と秘密鍵がセットになったPKCS#12形式で作成します。
pemファイルの作成やp12ファイルへ変換する作業は、VyOS上でもLinux上でも、opensslコマンドが使用できる環境であれば、どこで実施しても問題ありません。

証明書・秘密鍵のデータを取得(Android用)

コンフィグに保存された証明書・秘密鍵のデータを表示します。

# show pki certificate Android
 certificate <証明書データ>
 private {
     key <秘密鍵データ>
 }

pemファイルの作成(Android用)

以下のフォーマットでpemファイルを作成します。
証明書や秘密鍵の中身は、前述のコマンドで表示したデータ部分をそのまま貼り付けてください。

-----BEGIN CERTIFICATE-----
<クライアント証明書>
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
<クライアント秘密鍵>
-----END PRIVATE KEY-----

p12ファイルへ変換(Android用)

pemファイルのままではインストールできないので、PKCS#12形式のp12ファイルへ変換します。
Android用のクライアント証明書はパスワードの設定が必須です。

$ openssl pkcs12 -export -in Android-cert.pem -inkey Android-privkey.pem -out Android-client.p12
Enter Export Password:<パスワード>
Verifying - Enter Export Password:<パスワード>

作成されたAndroid-client.p12ファイルがクライアント証明書となります。

Windowsの場合

前述と同様の手順を実施するだけですが、p12ファイルへ変換する際にパスワードの設定は必須ではありません。
何も入力せずEnterキーを押下して構いません。

クライアントの設定

AndroidのVPN設定

  1. StrongSwanクライアントアプリのVPNプロファイル追加画面を開きます。
    以下の設定を行ったのち、INSTALL USER CERTIFICATEをタップします。

    Server サーバ名を入力
    VPN Type IKEv2 EAP-TLS (Certificate)を選択

  2. 予めAndroidへ転送しておいたp12ファイルを選択します。
  3. 証明書のパスワードを入力して、OKをタップします。
  4. VPNとアプリユーザー証明書が選択されていることを確認し、OKをタップします。
  5. 分かりやすい証明書の名前を設定します。(今回は説明のためデフォルトの名前のままとします)
  6. 証明書のリストが表示されるので、今インストールした証明書を選択して、選択をタップします。
  7. User certificateの項目に今インストールした証明書が表示されました。
    その他必要な設定を行って、SAVEすれば完了です。

WindowsのVPN設定

証明書のインストール

  1. 予めWindowsへ転送しておいたp12ファイルをダブルクリックすると、証明書のインポートウィザードが表示されます。
    保存場所が現在のユーザーとなっていることを確認し、次へをクリックします。
  2. 次へをクリックします。
  3. パスワードを設定した場合はパスワードを入力し、次へをクリックします。
  4. 証明書をすべて次のストアに配置するを選択し、参照をクリックします。
  5. 個人を選択し、OKをクリックします。
  6. 次へをクリックします。
  7. 最後に完了をクリックします。

VPN設定

  1. Windowsの設定アプリから、VPNの設定画面を開き、VPNを追加をクリックします。
  2. 以下の設定を行ったのち、保存をクリックします。
    接続名 分かりやすい名前を入力
    サーバー名またはアドレス サーバ名を入力
    VPNの種類 IKEv2を選択
    サインイン情報の種類 証明書を選択

  3. VPN設定が追加されるので、矢印ボタンをクリックしてから詳細オプションをクリックします。
  4. その他のVPNプロパティの編集をクリックします。
  5. セキュリティタブのデータの暗号化を、最強の暗号化にしてOKをクリックします。
  6. VPN設定の接続をクリックします。
  7. 初回に限り接続の確認がされるので、接続をクリックします。
  8. 接続されました。

まとめ

相変わらずAndroidとWindowsで仕様が異なり、証明書の作成に一手間必要でした。
が、無事にクライアント証明書によるIKEv2リモートアクセスVPNが実現できました。

ID/PASSを使った認証はなるべくなくした方が良いですからね。
皆さんもクライアント証明書を使ったVPNへ移行していきましょう。

おすすめ

コメントを残す