私はSSL/TLSプロトコルについて( https://tools.ietf.org/html/rfc5246 から)学習しており、プロトコルに関するいくつかの概念的な質問があります。
クライアントとサーバーは「hello」メッセージを交換し、その間にSSL/TLSバージョンと暗号スイートを選択します。より具体的には、クライアントは暗号スイートのリストを提案し、サーバーはそれを選択します(サーバーが何も選択しない場合、ハンドシェイクは失敗します)。さて、サーバーは証明書で使用されているものに対応する暗号スイートを選択しますか?
例:実行中のopenssl x509 -in <server_cert>.pem -text -noout
は、サーバー証明書に関する情報を提供します。サンプル証明書では、公開鍵アルゴリズムがrsaEncryption(2048ビット)であり、署名アルゴリズムがsha256WithRSAEncryptionであることがわかります。これは、ハンドシェイクで使用される暗号スイートの一部をあらかじめ決めていませんか?
サーバーとクライアントが暗号スイートについて合意したとしましょう。現在、クライアントはハンドシェイクの後半で証明書を提示することもできます。つまり、クライアント証明書の暗号は、選択した暗号スイートと互換性がある必要がありますか?
(同様の質問ですが、私が望むものには答えません: HTTPSの暗号スイートの選択 )
サーバー証明書の場合:暗号スイートは、サーバー証明書の鍵のタイプに応じて、鍵交換の種類を示します。あなたは基本的に以下のものを持っています:
TLS_RSA_ *暗号スイートの場合、キー交換では、クライアントが選択したランダム値をサーバーのRSA公開鍵で暗号化するため、サーバーの公開鍵のタイプはRSAであり、暗号化に適している必要があります(サーバーの証明書にKey Usage
「署名のみ」という拡張子。
TLS_DHE_RSA_ *暗号スイートの場合、キー交換は一時的なDiffie-Hellmanを使用し、サーバーはRSAキーを使用してDHキー交換の一部に署名します。したがって、サーバーの公開鍵はRSAタイプである必要があり、署名に適している必要があります(ここでも、証明書は鍵の使用を暗号化のみに制限してはなりません)。
TLS_DHE_DSS_ *およびTLS_DHE_ECDSA_ *暗号スイートは、エフェメラルDiffie-Hellman鍵交換を使用し、サーバーの鍵はそれぞれDSAおよびECタイプである必要があり、署名に適している必要があります。
TLS_ECDHE_ *暗号スイートは、Diffie-Hellman鍵交換が楕円曲線バリアントであることを除いて、TLS_DHE_ *暗号スイートに似ています。サーバーの証明書の条件は同じままです。
TLS_DH_ *とTLS_ECDH_ *の暗号スイートは異なります( 'DH'の後に 'E'がないことに注意してください)。これらのスイートの場合、サーバーの証明書にはDiffie-Hellman公開鍵(またはその楕円曲線バリアント)が直接含まれており、暗号スイートは、発行CAが証明書に署名するために使用するアルゴリズムを修飾します。たとえば、TLS_DH_RSA_ *は、「サーバーには、RSAを使用するCAによって署名された証明書に格納されたDH公開鍵がある」ことを意味します。これは、証明書の署名タイプが暗号スイートと関係がある唯一のケースです。実際にはそのような証明書は誰も使用しないため、このケースは無視できます。
クライアント証明書の場合:サーバーが要求すると、クライアントは証明書を提示します。クライアント証明書のタイプは、暗号スイートとは何の関係もありません(静的DH証明書の非常にまれなケースを除いて、実際に使用されたことはありません)。クライアント証明書は、署名に適している必要があります。サーバーは、クライアント証明書を要求するハンドシェイクメッセージの一部として、サポートされているアルゴリズムに関するいくつかの情報を送信します( 標準 を参照)。実際、TLS 1.2は、サポートされているアルゴリズムとハッシュ関数の組み合わせの柔軟なリストを提供することにより、このメカニズムをさらに拡張しています。