web-dev-qa-db-ja.com

TLSのRSA署名

ECDHE-RSAを使用したTLSハンドシェイクでは、ServerKeyExchangeフレームに、 RFC 4492 で指定されているように、RSA秘密鍵で署名されたECDHE ServerPublicKeyを含める必要があります。とった。

これをcrypto++ECDHE-RSA-likeで交換しようとしています。少し疑問に思っています:フレームの署名に使用されるスキーム

それは...ですか

  • Signature Schemes with Appendix(SSA)

または

  • Signature Schemes with Recovery(PSSR)?

PSSRを使用する唯一の利点は、前述のように here であり、メッセージを送信しないことであり、署名に組み込まれています。

さらに、それは RFC 5246 にも RFC 4492 にも記載されていません。

プログラマーの裁量ですか?

2
3isenHeim

正確な署名方式はプロトコルのバージョンによって異なります。ただし、すべての場合において、Crypto ++が「付録付きの署名方式」と呼ぶものに関連しています。

PKCS#1 は、2つの署名スキーム(およびここでは関係のない2つの非対称暗号化スキーム)を説明します。「古いもの」(「v1.5」と呼ばれます)と「新しいもの」(「 PSS」)。 SSL/TLSは古いバージョン(v1.5)に依存しています。

PKCS#1 v1.5署名の生成では、次のことが行われます。

  • 署名されるデータは、いくつかのハッシュ関数でハッシュされます。 x結果のバイトシーケンスを呼び出します。たとえば、ハッシュ関数がSHA-256の場合、xの長さは256ビット、つまり32バイトです。

  • ヘッダーtxに追加されます。ヘッダーは、ハッシュ関数を識別する固定バイトシーケンスです(技術的に、xは、DERでエンコードされたASN.1構造のパラメーターとして使用され、ハッシュ関数もOID;ただし、固定ヘッダーと考える方が簡単です)。

  • txの連結の前にいくつかのバイトが追加され、次の構造が得られます。

    00 01 FF FF ... FF 00tx

    つまり、値0のバイト、次に値1のバイト、次に値FFのいくつかのバイト、次に値0のバイト、次にt、次にxは、この順序で連結されます。 「FF」バイトの数は、RSAモジュラスの長さがバイト単位で正確に合計されるように調整されます(つまり、2048ビットのRSAキーの場合は256バイト)。このステップは、「PKCS#1タイプ1パディング」と呼ばれます。

  • 次に、埋め込み文字列はビッグ整数として解釈され(ビッグエンディアン規則を使用)、RSA署名スキームのコアにあるモジュラ指数に変換されます。

TLS-1.2の場合、署名スキームは、クライアントとサーバーがサポートするものに依存するハッシュ関数を使用して、上記のものとまったく同じである必要があります。 Signature Algorithms 拡張を使用すると、クライアントはClientHelloメッセージで、RSAアルゴリズムで使用できるハッシュ関数の種類を指定します。その拡張がない場合、サーバーはクライアントがSHA-1をサポートしていると想定する必要があります。 tヘッダーの値は、最も一般的なハッシュ関数の場合、PKCS#1の セクション9.2 で明示的に指定されています。

以前のTLSバージョン(SSL-3.0、TLS-1.0およびTLS-1.1)では、スキームは微妙に異なります: tヘッダーは空で、xはMD5とSHA-1ハッシュを連結したものであり、署名対象のハッシュです。したがって、tの長さは0であり、xの長さは36バイトです(MD5の場合は16バイト、20バイト) SHA-1の場合)。使用するハッシュ関数についてクライアントとサーバーの間で議論はありません。常にMD5 + SHA-1です。

マニュアルをざっと見ると、少なくとも[通常の]署名(TLS-1.2の場合)はRSASS<PKCS1v15, H>を使用してCrypto ++で計算できることが示されているようです。ここで、HSHA1SHA256... Crypto ++に、ハッシュがMD5とSHA-1を連結した古いスキームのコードが含まれていて、ヘッダーがないかどうかはわかりません。

4
Thomas Pornin