web-dev-qa-db-ja.com

クライアント証明書の認証目的でSSL証明書を使用できますか?

相互TLS認証の設定が有効になっているサードパーティのAPIに接続しようとしています。したがって、クライアント証明書をキーストア内にインストールし、TLSハンドシェイクプロセスで送信することになっています。

このプロセスでは、現在、クライアント側の証明書として commodopositive SSL を使用しています。 TLS呼び出しを行うと、サーバーが証明書を要求していますが、クライアントは証明書を送信していません。 SChannel Logを確認すると、次のような警告が表示されます。

リモートサーバーがTLSクライアント認証を要求しましたが、適切なクライアント証明書が見つかりませんでした。匿名接続が試行されます。このTLS接続要求は、サーバーのポリシー設定に応じて、成功または失敗する可能性があります。

だから私の疑問はこのようなものです、私はクライアント側の認証の目的で正しいタイプのX509証明書を使用していますか?他の特定のタイプを使用する必要がありますか?現在の証明書が送信されていないため。

1

場合によります。 X.509v3証明書には通常、許可された使用法(EKU)のリストを含む「拡張キー使用法」拡張フィールドが付属しています。

  • 通常のWeb server証明書には、「TLSサーバー認証」の使用法が含まれています(「TLSWebサーバー」と表示されることもありますが、実際にはWeb固有ではありません)。

  • クライアントとして機能するには、「TLSクライアント認証」を備えた証明書が必要です(Web固有のものが何もないにもかかわらず、「TLS Webクライアント」として表示されることがよくあります)。

通常の「Webサーバー」SSL証明書に両方使用法が含まれることは非常に一般的です。たとえば、Let's EncryptとDigiCertによって発行された証明書を調べていますが、すべてに両方の使用法が含まれているため、クライアント/相互認証に使用されます。

ただし、他の一部のCA、特にプライベート組織のCAでは、ほとんどの証明書にどちらか一方の使用法がある可能性がありますが、両方の使用法があることはめったにありません。

たとえば、OpenVPNは(他のプログラムのように「少なくとも TLSクライアント」ではなく)「のみ TLSクライアント」を厳密に要求していたため、そのeasy-rsaスクリプトサーバーのみとクライアントのみの証明書を発行しますが、混合の種類は発行しません。


したがって、証明書を調べて、必要なEKUが含まれていることを確認する必要があります。実際には、どの証明書ツールでも機能します。たとえば、Windowsの証明書のプロパティダイアログでは、Webブラウザ、openssl x509certtoolcertutilなどと同様に、これが「V3Extensions」の下に表示されます。 。

独自の内部CAを実行している場合も覚えておく価値があります。中間CA証明書を使用している場合は、それに注意してください。中間体はEKU拡張子を持っている必要はありませんが、それらがdo持っている場合、その中間体によって発行されたすべての証明書はそれによって制約されます。 (証明書を商業的に入手する場合は、心配する必要はありません。)


さらに、証明書にはbasic "Key Usage"フィールドがあり、これにはいくつかの非常に一般的な制限が含まれています。 「デジタル署名」とは、証明書がデータに署名できることを意味します(したがって、TLSでのEDH/EECDHハンドシェイクが許可されます)。 「鍵共有」は静的DH/ECDH用のようです。 「KeyEncipherment」は静的RSAハンドシェイクを可能にします。

公式のX.509v3ドキュメントは、次の場合に必要な使用法について非常に混乱しています...商用CAは通常、このフィールドを正しく取得します。ただし、プライベートCAの場合は、再確認する価値があります。

2
user1686