OpenVPNドキュメント

クライアントが接続先のサーバー証明書を検証しない場合に発生する可能性のある「Man-in-the-Middle」攻撃についての重要な注意事項

認証済みのクライアントがサーバーになりすまして他のクライアントに接続しようとする「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ファイルを参照する必要があります。