OpenVPNドキュメント
認証済みのクライアントがサーバーになりすまして他のクライアントに接続しようとする「Man-in-the-Middle」攻撃を回避するには、各クライアントにサーバー証明書を強制的に検証させる必要があります。
現在、これを実現させるための5つの方法を、優先順位の高い順に示します。
- [OpenVPN 2.1以降]特定の鍵の用途(Key usage)と拡張鍵の用途(Extended key usage)を指定してサーバー証明書を生成してください。
RFC3280では、TLS接続には以下の属性を提供する必要があると規定されています。
モード | 鍵の用途(Key usage) | 拡張鍵の用途(Extended key usage) |
---|---|---|
クライアント | digitalSignature | TLS Web Client Authentication |
keyAgreement | ||
digitalSignature, keyAgreement | ||
サーバー | digitalSignature, keyEncipherment | TLS Web Server Authentication |
digitalSignature, keyAgreement/td> |
- build-key-serverスクリプトを使用してサーバー証明書を作成できます(詳細についてはeasy-rsaのドキュメントを参照してください)。
適切な属性を設定することで、証明書をサーバー専用証明書として指定できます。
クライアント設定ファイルに以下の行を追加してください。
remote-cert-tls server
- [OpenVPN 2.0以前]build-key-serverスクリプトを使用してサーバー証明書を作成します(詳細についてはeasy-rsaのドキュメントを参照してください)
nsCertType=serverが設定され、証明書をサーバー専用証明書として指定できます。
クライアント設定ファイルに以下の行を追加してください。
ns-cert-type server
- これにより、証明書がOpenVPN設定ファイルのcaファイルによって署名されている場合でも、nsCertType=server指定がないサーバーへのクライアントの接続がブロックされます。
- サーバー証明書の共通名に基づいてサーバー接続の許可/拒否を制御するには、クライアントでtls-remoteディレクティブを使用します。
- tls-verifyスクリプトまたはプラグインを使用して、サーバー証明書に埋め込まれたX509サブジェクトのテスト結果に基づいてサーバー接続の許可/拒否を制御します。
- サーバー証明書とクライアント証明書を別々のCAで署名します。
クライアント設定のcaディレクティブはサーバー署名CAファイルを参照し、サーバー設定のcaディレクティブはクライアント署名CAファイルを参照する必要があります。