web-dev-qa-db-ja.com

TLSでRSAとECDSAを組み合わせて使用​​する

TLSクライアントとサーバーが通信し、両方の当事者を認証したいとします。それらはそれぞれ十分に信頼された証明書を持っていますが、1つはECDSA秘密キーに対応し、もう1つはRSA秘密キーに対応するか、または曲線が異なるECDSA秘密キーに対応する可能性があります(違いがあるかどうかは不明です)。これらの証明書の署名に使用されるアルゴリズムは指定していませんが、これが関連するかどうかを教えてください。これらの当事者は通信できますか-まったく、または具体的には、クライアントが主流の最新のブラウザであるか?

1
Eugene Ryabtsev

[〜#〜]はい[〜#〜]-TLSサーバーとクライアントが使用する鍵のタイプと証明書の間に必要な接続はありません認証(認証局と信頼の決定の間も不可)。

1.2までのTLSバージョン(および現在誰も使用していないはずのSSLv3)の場合、serverkey-and-certは、使用される暗号スイート。サーバーがクライアントから提供されたものの中から選択します。 rfc5246セクション7.4.2 へのページに関する最初の表を参照し、以前のバージョンでも同様です。実際には、これは別の方向に実装されます。暗号スイートを選択するとき、サーバーは、適切なキーと証明書を持つクライアントおよびから提供されたもののみを考慮します。 (サーバーが誤ってnokey-and-cert(s)で構成されている場合、これはJavaキーストアファイルのみを構成し、正しい手順に従わない人は、実際にはキーと証明書が含まれていないキーストアファイルを簡単に作成できます。これにより、サーバーは、「暗号なし」という例外またはエラーですべての接続を拒否します。一部の人々は混乱してスタックで質問します)。

ECDSA証明書の場合、クライアントは rfc4492セクション5.1.1で定義されている拡張子1 を使用して実装する曲線を指定することができ(ほとんどの場合)、上部のietf WebサイトによってリンクされているBrainpool用に7027によって変更されます。その場合、サーバーは指定された曲線を使用して証明書(および該当する場合はチェーン)のみを使用することを許可されます。したがって、実際には、ECDSA証明書(チェーン)がそのような(a )カーブ。クライアントは同様に、拡張11を使用してサーバー証明書で使用されるポイント形式を制限できますが、実際にはこれは通常問題ではありません。

TLS1.2のみで、RSAとECDSAの両方(およびDSAも同様)で、クライアントはsignature_algorithms rfc5246セクション7.4.1.4.1で定義されている拡張子1 を指定できます。これにより、両方の公開鍵アルゴリズムが制約されます。 )RSA、ECDSA、DSAおよびサーバー証明書チェーンで使用されるハッシュ。 rfc5246のみの7.4.2の最後のテキストを参照してください(以前のバージョンではありません)。 1.2より前は、サーバー証明書の上にあるCA /チェーン証明書に明示的な制約はありませんでした(ただし、めったに使用されない静的DH_ {RSA、DSS}およびECDH_ {RSA、ECDSA}キー交換を除く)。つまり、サーバーRSA証明書はRSA CAによって発行され、サーバーECDSA証明書はECDSA CAによって発行されます(同じ曲線またはより強い曲線、実際にはほとんどの場合、NSAのスイートBの2つの曲線、P-256およびP-384)。

TLS 1.3の場合、keyexchangeとサーバー証明書はciphersuiteに関連付けられなくなりました。代わりに、クライアントalwaysはsignature_algorithms拡張13を指定します(ただし、1.0-1.2とはほとんど異なる値を使用します)およびmayもsignature_algorithms_cert拡張50を指定します- rfc8446セクション4.2.3で説明 。サポートされている曲線は、3つのFIPS-186素数曲線(P-256、P-384、P-521)と2つのバーンスタイン曲線(ed25519、ed448)に制限されています。 -ポイント形式のオプションはありません。元々のX9曲線は非圧縮を使用する必要があり、バーンスタイン曲線は定義された唯一のフォーマットを使用します。

最後に、特にHTTPSを含むTLSを使用する一部のアプリケーションプロトコル、したがってWebブラウザーでは、サーバー証明書はクライアントが期待するhostnameと一致する必要があります。これは通常、完全修飾ドメイン名(FQDN)であり、TLS接続はIPアドレスレベルで行われるため、ClientHellomayにserver_name拡張(rfc3546で定義) 1.0の場合はrfc4366、1.1の場合はrfc4366、1.2および1.3の場合はrfc6066)を使用して、サーバーが使用するキーと証明書を選択できるようにします。

一方、client証明書は、主にサーバーから送信されたCertificateRequestメッセージによって制御されます。すべてのプロトコルで、サーバーがCertificateRequestを送信しない場合、クライアントはまったく認証されません。 1.0および1.1(およびSSLv3)では、CertificateRequestはサポートされている(受け入れ可能な)公開鍵アルゴリズムのみを指定します。これは、サーバー自身の鍵と証明書(チェーン)のアルゴリズムと同じである必要はありません。サーバーがクライアントの使用を好む認証局(CA)のリスト。これもサーバーの証明書チェーンで使用されるものと同じである必要はありません。 1.2では、サーバーは、ClientHelloの拡張機能がサーバー証明書チェーンを制約するのと同じ方法でクライアント証明書チェーンを制約するsignature_algorithmsフィールドも指定します。 1.0から1.2のECDSAの場合、曲線に制約はありません。明らかに、サーバーは決して制約されないという理論に基づいています。組み込み/ IoT(!)、ただしサーバーはServerHello(beforeCertificateRequest)の拡張11を使用してポイント形式を制約する場合があり、AFAICSはメリットを提供しません。 1.3では、サーバーは、signature_algorithmsを指定する必要があり、signature_algorithms_certだけでなく、certificate_authoritiesも指定できます(現在は空のフィールドではなく、オプションの拡張子です)。 rfc8446セクション4.3.2 を参照して、「以前のバージョン」に関するテキストを含めます。

2