AWS VPN Client(AWS Client VPN for Desktop)でプロファイル追加する際に OpenVPN 設定 verify-x509-name 関連のエラーが発生した時の対処方法

AWS VPN Client に新規のプロファイルを追加しようとした際に"OpenVPN 設定の行「verify-x509-name server name」には、サポートされていないディレクティブが含まれています。それを OpneVPN 設定から削除します。"というエラーが発生しました。クライアントのバージョンアップで対応できます。

コンバンハ、千葉(幸)です。

AWS VPN Client(AWS Client VPN for Desktopとも)は、AWS が提供する AWS Client VPN 用のクライアントツールです。 *1「AWS Client VPN」とぱっと見で見分けがつきづらいので、以降は「AWS VPN クライアント」と表記します。

AWS VPN クライアント for Windows へ、プロファイル(簡単に言えば接続設定)を追加する際にエラーが発生したことがありました。

OpenVPN 設定の行「verify-x509-name server name」には、サポートされていないディレクティブが含まれています。それを OpneVPN 設定から削除します。

このエラーの詳細と、その対処方法を記します。

先にまとめ

  • AWS VPN クライアントでverify-x509-nameディレクティブに対応したのは以下のバージョン以降
    • Windows:3.2.0(2023/1/23リリース)
    • macOS:3.2.0(2023/1/23リリース)
    • Linux:3.4.0(2023/2/14リリース)
  • 2023/8 時点では AWS マネジメントコンソールからダウンロードした VPN クライアント設定ファイルにverify-x509-nameディレクティブが含まれている(ことがある) *2
  • バージョンが対応していない場合、以下のいずれかで対処しよう
    • クライアントのバージョンアップを行う(推奨)
    • verify-x509-nameを削除する

AWS VPN クライアントで発生したエラーの詳細

冒頭の繰り返しとなりますが、発生したエラーメッセージは以下です。

OpenVPN 設定の行「verify-x509-name server name」には、サポートされていないディレクティブが含まれています。それを OpneVPN 設定から削除します。

シチュエーションについて補足します。

  • 使用していた AWS VPN クライアント は for Windows のバージョン 3.1.0
  • プロファイル追加の際に指定した VPN 設定ファイルは AWS マネジメントコンソールからダウンロードしたままの状態

サーバー証明書の有効期限切れの対応の一環として、以下の作業を行っている途中で発生しました。

  1. 新しいサーバー証明書の ACM へのインポートを行う
  2. AWS Client VPN エンドポイントで 1. サーバー証明書の ACM を関連付ける
  3. AWS マネジメントコンソールから新たな VPN クライアント設定ファイルをダウンロードする
  4. AWS VPN クライアントにプロファイル追加する際に、 3. のVPN クライアント設定ファイルを指定

「OpenVPN 設定」?

OpenVPN はオープンソースの VPN ソリューションです。

AWS Client VPN への接続には、OpenVPN ベースの VPN クライアントを使用します。(AWS VPN クライアントも OpenVPN ベースです。AWS VPN クライアントがリリースされるまでは、サードパーティの VPN クライアントを用いる必要がありました。)VPN クライアント設定ファイルも OpenVPN の設定ファイルベースで書かれることになります。

AWS VPN クライアントでは OpenVPN のすべての設定がサポートされているわけではありません。ドキュメントではサポートされているディレクティブがリストされています。

AWS が提供するクライアントは、次の OpenVPN ディレクティブをサポートしています。

  • auth-user-pass
  • ca
  • cert
  • cipher
  • client
  • connect-retry
  • cryptoapicert (Windows のみ)
  • dev
  • key
  • nobind
  • persist-key
  • persist-tun
  • proto
  • remote
  • remote-cert-tls
  • remote-random-hostname
  • reneg-sec
  • resolv-retry
  • static-challenge
  • tun-mtu
  • tun-mtu-extra
  • verb

AWS が提供するクライアントを使用して接続する - AWS クライアント VPN

ここでサポートされていないディレクティブを含む VPN クライアント設定ファイルを用いようとすると、原則エラーが発生することになります。

(原則、と言っているのは例外があるからで、それは後述します。)

AWS VPN クライアントでエラーが発生した原因と対処方法

今回のエラーが発生した原因は、AWS VPN クライアントのバージョンが古かったことです。先述の通り、3.1.0 を使用していました。

Windows 向けの AWS VPN クライアントでは、バージョン 3.2.0 からverify-x509-nameがサポートされています。

AWS_Client_VPN_for_Windows_release

3.1.0 のクライアントとしては、自身でサポートしていないverify-x509-nameディレクティブが VPN クライアント設定ファイルに含まれていたために、冒頭のエラーが発生したというわけでした。

よって、以下のいずれかで対応可能です。

  • クライアントのバージョンアップを行う(推奨)
  • verify-x509-nameディレクティブを削除する

前者の場合は、以下から最新バージョンのクライアントをダウンロードするとよいでしょう。クライアントツールを最新に保つに越したことはないので、基本的にはこちらの対応を推奨します。

AWS マネジメントコンソールからダウンロードした VPN クライアント設定ファイル

後者の「verify-x509-nameディレクティブを削除する」について補足します。

AWS マネジメントコンソールからダウンロードした VPN クライアント設定ファイルは以下のような内容になっています。

cvpn-endpoint-xxxxxx.ovpn

client
dev tun
proto udp
remote cvpn-endpoint-xxxxxxxxxxxxx.prod.clientvpn.ap-northeast-1.amazonaws.com 443
remote-random-hostname
resolv-retry infinite
nobind
remote-cert-tls server
cipher AES-256-GCM
verb 3
<ca>
-----BEGIN CERTIFICATE-----
(ACMにインポートされたサーバー証明書の中身)
-----END CERTIFICATE-----

</ca>
auth-user-pass

reneg-sec 0

verify-x509-name server name

(AWS Client VPN エンドポイントの認証方式で相合認証を用いる場合、この設定ファイルにクライアント証明書の情報を追記することになります。今回のケースではActive Directory認証方式のため、ダウンロードしたままの設定ファイルを用いました。)

末尾のverify-x509-nameディレクティブが今回のトピックです。今回使用しているサーバー証明書のコモンネームがserverであるためverify-x509-name {server} nameと値が入っていますが、別の名称を使用している場合は違った値が入ります。

この行を丸ごと削除するか、当該行の先頭に#をつけてコメントアウトすることでもエラーに対応できます。

とは言え、繰り返しになりますがクライアントのバージョンアップで対応できるのであればそれに越したことはありません。

verify-x509-name ディレクティブの役割は?

このディレクティブが何をしているかを確認しておきます。以下のページが参考になりそうです。

--verify-x509-name args
Accept connections only if a host's X.509 name is equal to name. The remote host must also pass all other tests of verification.

Valid syntax:

verify-x509 name type

Which X.509 name is compared to name depends on the setting of type. type can be subject to match the complete subject DN (default), name to match a subject RDN or name-prefix to match a subject RDN prefix. Which RDN is verified as name depends on the --x509-username-field option. But it defaults to the common name (CN),(略)

verify-x509-name 名称 タイプの構文で指定します。

タイプは以下のいずれかになります。

  • subject
  • name(今回の設定ファイルで指定されているのはコレ)
  • name-prefix

タイプとしてnameが指定されている際の検証内容はコントロール可能な部分 *3ですが、デフォルトではコモンネームを検証します。

今回であれば、VPN 接続時の相手方のサーバー証明書のコモンネームがserverと一致するかを検証します。

verify-x509-nameは中間者攻撃に対する対策として有効です。例えば攻撃者がクライアントとサーバーの中間に割り込み、偽のサーバーへ通信を行わせようとしたとします。その際に相手方(偽のサーバー)のサーバー証明書のコモンネームを検証し、定義された内容(今回であればserver)と異なるようであればクライアントは接続を拒否します。

このディレクティブを削ってセキュリティレベルを下げるよりは、クライアントのバージョンアップで対応した方が望ましいでしょう。

余談:OpenVPN フラグ? OpenVPN ディレクティブ?

これまでverify-x509-nameのことを「ディレクティブ」と呼んできたのですが、AWS VPN クライアントのリリースノートにおいては「フラグ」と呼ばれています。

これまでの機能追加で、「OpenVPN ディレクティブ」と「OpenVPN フラグ」の表現が使い分けられている様子が見てとれます。

AWS_Client_VPN_for_Windows_-_OpenVPN_flag

ここで「OpenVPN フラグ」と表現されているものについては、先述の「サポートされている OpenVPN ディレクティブ」のリストに含まれていません。

verify-x509-nameのことは「ディレクティブ」と呼ぶ方が個人的にはしっくりくるのですが、正式名称としては異なるかもしれません。

「OpenVPN のこの機能は AWS Client VPNでサポートされているか?」を確認する際には、「ディレクティブ」という切り口だけでなく「フラグ」という切り口でも確認すると良さそうです。

終わりに

AWS VPN クライアントへのプロファイル追加時に設定ファイルのディレクティブ起因のエラーが出る、という内容でした。

最後に VPN クライアント設定ファイルを眺めたのが2022年ごろだったので、verify-x509-nameという見慣れぬディレクティブに少し面食らいました。

AWS VPN クライアントの機能向上にあわせて設定ファイルのデフォルトも変わること、ディレクティブの詳細を確認したい時は OpenVPN のリファレンスを参照すると良いことを学びました。

少しニッチな内容でしたが、同じエラーに直面した方の参考になれば幸いです。

以上、 チバユキ (@batchicchi) がお送りしました。

参考

脚注

  1. ツールを指して単に AWS Client VPN と呼ばれることもあります。ややこしいですね。
  2. AWS Client VPN エンドポイントの設定に依存する部分かもしれません。
  3. 「少なくともOpenVPNではコントロール可能な部分、という言い方が正しいです。AWS Client VPNにおいても同様にサポートされるかは未確認です。