web-dev-qa-db-ja.com

JVMプロパティを使用してPerfect Forward Secrecyを強制する方法は?

このブログ投稿 によれば、Perfect Forward Secrecy(PFS)は以下によって提供されます:

アルゴリズム標準名のリストにあるもので始まる[〜#〜] tls [〜#〜](トランスポートレベルのセキュリティ)以下タイプ[〜#〜] dhe [〜#〜](Diffie-Hellman Exchange)。

例えば。 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA、TLS_DHE_RSA_WITH_AES_128_CBC_SHA

Java.securityファイルでJavaの「jdk.tls.disabledAlgorithms」プロパティを使用してこれを実現したいと思います。現在、そのプロパティには次の値があります。

jdk.tls.disabledAlgorithms = SSLv3、TLSv1、TLSv1.1、RC4、MD5、DESede、DH keySize <768、RSA keySize <2048

そして、以下はTestSSLServerによる結果です。

$ Java -jar TestSSLServer.jar 127.0.0.1 9443
Supported versions: TLSv1.2
Deflate compression: no
Supported cipher suites (ORDER IS NOT SIGNIFICANT):
  TLSv1.2
     DHE_RSA_WITH_AES_128_CBC_SHA
     DHE_RSA_WITH_AES_256_CBC_SHA
     DHE_RSA_WITH_AES_128_CBC_SHA256
     DHE_RSA_WITH_AES_256_CBC_SHA256
     TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
     TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
     TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
     TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
     TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
     TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
     TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
     TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
----------------------
Server certificate(s):
  xxxxx
----------------------
Minimal encryption strength:     strong encryption (96-bit or more)
Achievable encryption strength:  strong encryption (96-bit or more)
BEAST status: protected
CRIME status: protected

それでも、PFSを提供しないスイートを削除するメカニズムを見つけることができませんでした。例えば。 「DHE_RSA_WITH_AES_128_CBC_SHA」。

これを「jdk.tls.disabledAlgorithms」で実行できますか?そうでない場合、他のJVMレベルのメカニズムはありますか?

[〜#〜]更新[〜#〜]

@Steffenが以前にリストしたすべての暗号がPFSを提供していることを確認した後、別のサーバーで再度テストしたところ、RSAが鍵交換アルゴリズムとしてリストされていることがわかります。今回は2つのツールで試した-どちらも [〜#〜] owasp [〜#〜] で推奨

jdk.tls.disabledAlgorithms = SSLv3、TLSv1、TLSv1.1、RC4、MD5、DESede、RSA keySize <2048

注:このプロパティを使用して「DH keySize <2048」を設定しても効果はありませんでした。 @Steffenが推奨するように、DHキーのサイズを増やすには、システムプロパティ「-Djdk.tls.ephemeralDHKeySize = 2048」を使用する必要がありました。

TestSSLServer

Supported cipher suites (ORDER IS NOT SIGNIFICANT):
  TLSv1.2
     RSA_WITH_AES_128_CBC_SHA
     DHE_RSA_WITH_AES_128_CBC_SHA
     RSA_WITH_AES_256_CBC_SHA
     DHE_RSA_WITH_AES_256_CBC_SHA
     RSA_WITH_AES_128_CBC_SHA256
     RSA_WITH_AES_256_CBC_SHA256
     DHE_RSA_WITH_AES_128_CBC_SHA256
     DHE_RSA_WITH_AES_256_CBC_SHA256
     TLS_RSA_WITH_AES_128_GCM_SHA256
     TLS_RSA_WITH_AES_256_GCM_SHA384
     TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
     TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
     TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
     TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
     TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
     TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
     TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
     TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

testssl.sh

Testing all 124 locally available ciphers against the server, ordered by encryption strength 

Hexcode  Cipher Suite Name (OpenSSL)       KeyExch.  Encryption Bits
------------------------------------------------------------------------
 xc030   ECDHE-RSA-AES256-GCM-SHA384       ECDH 256   AESGCM    256       
 xc028   ECDHE-RSA-AES256-SHA384           ECDH 256   AES       256       
 xc014   ECDHE-RSA-AES256-SHA              ECDH 256   AES       256       
 x9f     DHE-RSA-AES256-GCM-SHA384         DH 2048    AESGCM    256       
 x6b     DHE-RSA-AES256-SHA256             DH 2048    AES       256       
 x39     DHE-RSA-AES256-SHA                DH 2048    AES       256       
 x9d     AES256-GCM-SHA384                 RSA        AESGCM    256       
 x3d     AES256-SHA256                     RSA        AES       256       
 x35     AES256-SHA                        RSA        AES       256       
 xc02f   ECDHE-RSA-AES128-GCM-SHA256       ECDH 256   AESGCM    128       
 xc027   ECDHE-RSA-AES128-SHA256           ECDH 256   AES       128       
 xc013   ECDHE-RSA-AES128-SHA              ECDH 256   AES       128       
 x9e     DHE-RSA-AES128-GCM-SHA256         DH 2048    AESGCM    128       
 x67     DHE-RSA-AES128-SHA256             DH 2048    AES       128       
 x33     DHE-RSA-AES128-SHA                DH 2048    AES       128       
 x9c     AES128-GCM-SHA256                 RSA        AESGCM    128       
 x3c     AES128-SHA256                     RSA        AES       128       
 x2f     AES128-SHA                        RSA        AES       128       

RSAを認証リストからも削除するため、RSAを無効な暗号として指定することはできません。キー交換だけではありません。

JVMレベルのプロパティ/構成を介してPFSを実現するにはどうすればよいですか? Java 1.8.0_111を使用して、クライアントとサーバーの両方を同じマシンで実行しています。

5
drox

Qualys SSLtestがjdk.tls.disabledAlgorithmsJava.securityで「弱い」と呼んでいるすべての暗号スイートを一覧表示することにより、フォワードシークレシーを適用できます。 https://stackoverflow.com/questions/41237075/disabling-specific-weak-ciphers-and-enforcing-perfect-forward-secrecy-using-jvm でBart Mortelmansの回答を参照してください。

私はこれで終わりました:

[root@dolphin12 ~]# grep ^jdk.tls.dis -A6 /usr/lib/jvm/Java/jre/lib/security/Java.security
jdk.tls.disabledAlgorithms=SSLv2Hello, SSLv3, TLSv1, TLSv1.1, DES, DESede, RC4, MD5withRSA, DH keySize < 1024, \
    EC keySize < 224, DES40_CBC, RC4_40, \
    TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, \
    TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA, \
    TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_GCM_SHA256, \
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, \
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA

そこには非効率的、不必要、または二重のものが含まれている可能性がありますが、Aグレードを与え、ChromeセキュリティツールがAES_256_CBC with HMAC-SHA1について不平を言うのを防ぎました。時代遅れの暗号」。

3
Onnonymous

提供するすべての暗号スイートは、DHEおよびECDHE暗号スイートであるため、PFSを提供します。 DHE_RSA_WITH_AES_128_CBC_SHAのRSAは、RSAが認証に使用されることのみを指定します。ただし、DHEは、PFSで重要な部分である鍵交換に使用されます。

それとは別に:弱いと見なされる768ビットのDHキーサイズを許可します。 DHには少なくとも1024ビットを使用しますが、2048を使用してください。

1
Steffen Ullrich