OpenSSL:DHパラメーターの表示


15

diffie hellmanキー交換に依存するSSL暗号を使用する場合、使用される秘密キーのサイズは、そのキー交換のセキュリティにとって非常に重要です。

「openssl s_client」ツールを使用してサーバーに接続する場合、使用されているDHパラメーターを照会するにはどうすればよいですか?

回答:


17

使いやすいコマンドラインスイッチについては知りませんが、openssl s_clientコマンドラインで-msgは、ハンドシェイクメッセージの16進ダンプを取得するオプションを追加できます。次に、ServerKeyExchangeメッセージを探します。次のようになります。

<<< TLS 1.2 Handshake [length 030f], ServerKeyExchange
    0c 00 03 0b 01 00 ff ff ff ff ff ff ff ff c9 0f
    da a2 21 68 c2 34 c4 c6 62 8b 80 dc 1c d1 29 02
    4e 08 8a 67 cc 74 02 0b be a6 3b 13 9b 22 51 4a
    (...)

そして、それはそのように読みます:

  • 0c 00 03 0b:長さが0x00030Bバイトの「ServerKeyExchange」タイプ(「0c」)のメッセージ。
  • 最初の要素は、2バイトの長さのヘッダーを持つ大きな整数としてのDHモジュラスです。ここで、長さはとしてエンコードされ01 00、0x0100バイトでエンコードされた整数を意味します。256バイトであるため、モジュラスの長さは2041〜2048ビットです。
  • 符号なしビッグエンディアン順で、モジュラスバイトが続きます。この場合、モジュラスの上位バイトはですff ff ff ff...。モジュラスの長さは正確に2048ビットです。

ECDHE暗号スイート(楕円曲線)を使用する場合ServerKeyExchange、もちろん形式は異なります。

メッセージの定義については、標準を参照ServerKeyExchangeください。DHE暗号スイートの場合、モジュラスp、ジェネレーターgおよびサーバーDH公開キーyがこの順序で含まれ、それぞれ上記の形式の大きな整数として表されます(バイト単位の長さを含む16ビットヘッダー、次に整数符号なしビッグエンディアンエンコーディングの値)。

最近のOpenSSLのバージョンは、サーバーの鍵ペアの強さ(セキュリティの観点から)マッチが(に使用したDHの係数サイズを選択する傾向が署名しServerKeyExchangeたメッセージを)。上記の例では、サーバーは2048ビットのRSAキーを持っているため、OpenSSLは2048ビットのDHモジュラス(この場合、RFC 3526、セクション3で説明されいる既知のモジュラス)の使用を選択しました。

他の一部のサーバーは、より大きなDHグループをサポートしない既存のクライアントとの互換性を確保するために1024ビットDHグループに固執します(最大の犯罪者はJavaのSSL実装であり、2012年のJava 8ビルド56で修正されました)。DHE暗号スイートのTLSプロトコルの既知の欠陥は、クライアントがサポートするモジュラスサイズを指定する方法がないことです(クライアントは受け入れる曲線の正確なリストを指定できるため、これはECDHEで修正されます) 。


1
OpenSSLはDHEを自動選択しませんが、アプリのコールバックは可能です。OpenSSL 1.0.2(2015年1月)は、オプションでECDHEを自動選択できます。また、1.0.2 s_clientでは、「ハンドシェイクがxを読み取りyを書き込む」直前に、「Temp server key」DH&sizeまたはECDH&curveを常に表示します。デコードします。DHEを自動選択するのは最近のApache mod_sslです:httpd.apache.org/docs/trunk/mod/mod_ssl.html#sslcertificatefile(Javaクライアントに関する問題に注意してください)。
dave_thompson_085

私は、OpenSSL 1.0.1eを使用して、私はいずれかを取得しないServerKeyExchange0c 00 03 0b。出力を取得するための正確なコマンドを提供できますか?で始まるハンドシェイクがありません0c
-rubo77

サーバーによって選択された暗号スイートが「DHE」または「ECHDE」暗号スイートではない場合、ServerKeyExchangeメッセージはありません。
トーマスポーリン

<<< TLS 1.2 Handshake [length 01cd]、ServerKeyExchange 0c 00 01 c9 03 00 17 41 04 08 5f 82 88 1e e5 b6に続いて、5番目のオクテットから始まる0x1c9の長さに対応する443オクテットが続きます。しかし、「0300」は768オクテットを意味するように見えますが、DHパラメータは「2048」ビットのみであると確信しています。
法律

1
@ Law29これはECDHE ServerKeyExchangeのように見えます。楕円曲線を使用する場合、「03」は「これは名前付き曲線であり、次の2バイトは曲線識別子をエンコードする」ことを意味します。「00 17」は曲線識別子であり、NIST P-256(ECDHEで最も使用される曲線)です。「41」はパブリックポイントの長さです。これは、非圧縮形式のP-256ポイントの正確な値です。そのようなポイントは、値0x04のバイトで始まり、それがまさにあなたが持っているものです。要約すると、TLS 1.2ハンドシェイクはDHEではなくECDHEを実際に使用しているようです。
トーマスポーリン

9

PEM形式の証明書がある場合は、このコマンドを試すことができます。Opensslコマンドから適切な出力が得られるはずです。

openssl dhparam -inform PEM -in ./imapd.pem -check -text

(出力例)
    PKCS#3 DHパラメーター:(512ビット)
        プライム:
            xx:xx:xx:xx
            xx:xx:xx:xx
            xx:xx:xx:xx
        ジェネレーター:2(0x2)
DHパラメータは問題ないようです。
-----開始DHパラメーター-----
XXXX
XXXX
----- END DHパラメーター-----

これがあなたが探しているものであることを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.