【问题标题】:Java 7 support of AES-GCM in SSL/TLS?Java 7 在 SSL/TLS 中支持 AES-GCM?
【发布时间】:2020-09-16 03:33:15
【问题描述】:

根据 Java 7 文档以及第三方供应商,Java 7 似乎应该支持 AES-GCM 套件:

  1. ibm java 7
  2. java 7 ssl doc

我在客户端和服务器之间的协商中遇到了一些错误,无法协商密码,因为它仅限于 AES-GCM 密码。经过调查,我发现客户端和服务器(tomcat 实例)似乎不支持密码套件。在客户端运行一些示例代码以获取输出:

// Create an SSLContext that uses our TrustManager
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, trustAllCerts, new SecureRandom());

SSLParameters params = context.getSupportedSSLParameters();
String[] suites = params.getCipherSuites();
System.out.println("Java version : " + System.getProperty("java.runtime.version"));
System.out.println("Connecting with " + suites.length + " cipher suites supported:");

for (int i = 0; i < suites.length; i++) {
    System.out.println();
    System.out.print(" ********* ");
    System.out.print(suites[i]);
    System.out.print(" ********* ");
}

Java version: 1.7.0_51-b13
Connecting with 63 cipher suites supported:

 ********* TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 ********* 
 ********* TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 ********* 
 ********* TLS_RSA_WITH_AES_128_CBC_SHA256 ********* 
 ********* TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 ********* 
 ********* TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 ********* 
 ********* TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 ********* 
 ********* TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 ********* 
 ********* TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA ********* 
 ********* TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA ********* 
 ********* TLS_RSA_WITH_AES_128_CBC_SHA ********* 
 ********* TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA ********* 
 ********* TLS_ECDH_RSA_WITH_AES_128_CBC_SHA ********* 
 ********* TLS_DHE_RSA_WITH_AES_128_CBC_SHA ********* 
 ********* TLS_DHE_DSS_WITH_AES_128_CBC_SHA ********* 
 ********* TLS_ECDHE_ECDSA_WITH_RC4_128_SHA ********* 
 ********* TLS_ECDHE_RSA_WITH_RC4_128_SHA ********* 
 ********* SSL_RSA_WITH_RC4_128_SHA ********* 
 ********* TLS_ECDH_ECDSA_WITH_RC4_128_SHA ********* 
 ********* TLS_ECDH_RSA_WITH_RC4_128_SHA ********* 
 ********* TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA ********* 
 ********* TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA ********* 
 ********* SSL_RSA_WITH_3DES_EDE_CBC_SHA ********* 
 ********* TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA ********* 
 ********* TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA ********* 
 ********* SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA ********* 
 ********* SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA ********* 
 ********* SSL_RSA_WITH_RC4_128_MD5 ********* 
 ********* TLS_EMPTY_RENEGOTIATION_INFO_SCSV ********* 
 ********* TLS_DH_anon_WITH_AES_128_CBC_SHA256 ********* 
 ********* TLS_ECDH_anon_WITH_AES_128_CBC_SHA ********* 
 ********* TLS_DH_anon_WITH_AES_128_CBC_SHA ********* 
 ********* TLS_ECDH_anon_WITH_RC4_128_SHA ********* 
 ********* SSL_DH_anon_WITH_RC4_128_MD5 ********* 
 ********* TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA ********* 
 ********* SSL_DH_anon_WITH_3DES_EDE_CBC_SHA ********* 
 ********* TLS_RSA_WITH_NULL_SHA256 ********* 
 ********* TLS_ECDHE_ECDSA_WITH_NULL_SHA ********* 
 ********* TLS_ECDHE_RSA_WITH_NULL_SHA ********* 
 ********* SSL_RSA_WITH_NULL_SHA ********* 
 ********* TLS_ECDH_ECDSA_WITH_NULL_SHA ********* 
 ********* TLS_ECDH_RSA_WITH_NULL_SHA ********* 
 ********* TLS_ECDH_anon_WITH_NULL_SHA ********* 
 ********* SSL_RSA_WITH_NULL_MD5 ********* 
 ********* SSL_RSA_WITH_DES_CBC_SHA ********* 
 ********* SSL_DHE_RSA_WITH_DES_CBC_SHA ********* 
 ********* SSL_DHE_DSS_WITH_DES_CBC_SHA ********* 
 ********* SSL_DH_anon_WITH_DES_CBC_SHA ********* 
 ********* SSL_RSA_EXPORT_WITH_RC4_40_MD5 ********* 
 ********* SSL_DH_anon_EXPORT_WITH_RC4_40_MD5 ********* 
 ********* SSL_RSA_EXPORT_WITH_DES40_CBC_SHA ********* 
 ********* SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA ********* 
 ********* SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA ********* 
 ********* SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA ********* 
 ********* TLS_KRB5_WITH_RC4_128_SHA ********* 
 ********* TLS_KRB5_WITH_RC4_128_MD5 ********* 
 ********* TLS_KRB5_WITH_3DES_EDE_CBC_SHA ********* 
 ********* TLS_KRB5_WITH_3DES_EDE_CBC_MD5 ********* 
 ********* TLS_KRB5_WITH_DES_CBC_SHA ********* 
 ********* TLS_KRB5_WITH_DES_CBC_MD5 ********* 
 ********* TLS_KRB5_EXPORT_WITH_RC4_40_SHA ********* 
 ********* TLS_KRB5_EXPORT_WITH_RC4_40_MD5 ********* 
 ********* TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA ********* 
 ********* TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5 ********* INFO - Received response from post device of : 

不知道有没有人遇到过这样的问题。

Java 7 是否支持在 SSL/TLS 中使用 AES-GCM?

【问题讨论】:

    标签: java security ssl aes


    【解决方案1】:

    SunJSSE Provider of Java 7 中没有 GCM 密码套件(假设是 Oracle JRE),尽管它支持 TLS 1.2。

    这些是introduced in Java 8(请参阅“SunJSSE 提供者”部分中的密码套件表)。

    1.8.0-ea-b124    
    Connecting with 71 cipher suites supported:
    
     ********* TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 ********* 
     ********* TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 ********* 
     ********* TLS_RSA_WITH_AES_128_CBC_SHA256 ********* 
     ********* TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 ********* 
     ********* TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 ********* 
     ********* TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 ********* 
     ********* TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 ********* 
     ********* TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA ********* 
     ********* TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA ********* 
     ********* TLS_RSA_WITH_AES_128_CBC_SHA ********* 
     ********* TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA ********* 
     ********* TLS_ECDH_RSA_WITH_AES_128_CBC_SHA ********* 
     ********* TLS_DHE_RSA_WITH_AES_128_CBC_SHA ********* 
     ********* TLS_DHE_DSS_WITH_AES_128_CBC_SHA ********* 
     ********* TLS_ECDHE_ECDSA_WITH_RC4_128_SHA ********* 
     ********* TLS_ECDHE_RSA_WITH_RC4_128_SHA ********* 
     ********* SSL_RSA_WITH_RC4_128_SHA ********* 
     ********* TLS_ECDH_ECDSA_WITH_RC4_128_SHA ********* 
     ********* TLS_ECDH_RSA_WITH_RC4_128_SHA ********* 
     ********* TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 ********* 
     ********* TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ********* 
     ********* TLS_RSA_WITH_AES_128_GCM_SHA256 ********* 
     ********* TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 ********* 
     ********* TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 ********* 
     ********* TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 ********* 
     ********* TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 ********* 
     ********* TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA ********* 
     ********* TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA ********* 
     ********* SSL_RSA_WITH_3DES_EDE_CBC_SHA ********* 
     ********* TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA ********* 
     ********* TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA ********* 
     ********* SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA ********* 
     ********* SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA ********* 
     ********* SSL_RSA_WITH_RC4_128_MD5 ********* 
     ********* TLS_EMPTY_RENEGOTIATION_INFO_SCSV ********* 
     ********* TLS_DH_anon_WITH_AES_128_GCM_SHA256 ********* 
     ********* TLS_DH_anon_WITH_AES_128_CBC_SHA256 ********* 
     ********* TLS_ECDH_anon_WITH_AES_128_CBC_SHA ********* 
     ********* TLS_DH_anon_WITH_AES_128_CBC_SHA ********* 
     ********* TLS_ECDH_anon_WITH_RC4_128_SHA ********* 
     ********* SSL_DH_anon_WITH_RC4_128_MD5 ********* 
     ********* TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA ********* 
     ********* SSL_DH_anon_WITH_3DES_EDE_CBC_SHA ********* 
     ********* TLS_RSA_WITH_NULL_SHA256 ********* 
     ********* TLS_ECDHE_ECDSA_WITH_NULL_SHA ********* 
     ********* TLS_ECDHE_RSA_WITH_NULL_SHA ********* 
     ********* SSL_RSA_WITH_NULL_SHA ********* 
     ********* TLS_ECDH_ECDSA_WITH_NULL_SHA ********* 
     ********* TLS_ECDH_RSA_WITH_NULL_SHA ********* 
     ********* TLS_ECDH_anon_WITH_NULL_SHA ********* 
     ********* SSL_RSA_WITH_NULL_MD5 ********* 
     ********* SSL_RSA_WITH_DES_CBC_SHA ********* 
     ********* SSL_DHE_RSA_WITH_DES_CBC_SHA ********* 
     ********* SSL_DHE_DSS_WITH_DES_CBC_SHA ********* 
     ********* SSL_DH_anon_WITH_DES_CBC_SHA ********* 
     ********* SSL_RSA_EXPORT_WITH_RC4_40_MD5 ********* 
     ********* SSL_DH_anon_EXPORT_WITH_RC4_40_MD5 ********* 
     ********* SSL_RSA_EXPORT_WITH_DES40_CBC_SHA ********* 
     ********* SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA ********* 
     ********* SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA ********* 
     ********* SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA ********* 
     ********* TLS_KRB5_WITH_RC4_128_SHA ********* 
     ********* TLS_KRB5_WITH_RC4_128_MD5 ********* 
     ********* TLS_KRB5_WITH_3DES_EDE_CBC_SHA ********* 
     ********* TLS_KRB5_WITH_3DES_EDE_CBC_MD5 ********* 
     ********* TLS_KRB5_WITH_DES_CBC_SHA ********* 
     ********* TLS_KRB5_WITH_DES_CBC_MD5 ********* 
     ********* TLS_KRB5_EXPORT_WITH_RC4_40_SHA ********* 
     ********* TLS_KRB5_EXPORT_WITH_RC4_40_MD5 ********* 
     ********* TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA ********* 
     ********* TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5 ********* 
    

    【讨论】:

    • 新的 Java 8 文档和密码套件客户端列表从表面上看具有新的 AES-GCM 密码。该文档还消除了我在客户端/服务器端 TLS 1.2 支持(特别是对于 Java 7)方面看到的一些混淆,因为我无法弄清楚为什么 Java 7 尝试启用 TLSv1.2 客户端失败但似乎可以工作服务器侧面很好。在获得这些文档以及在哪里查看它们之后,现在才有意义。
    • @user2403018,AES-GCM 密码仅出现在 Java 7 的付费版本 191 中,bugs.java.com/bugdatabase/view_bug.do?bug_id=8180834
    【解决方案2】:

    正如其他人所说,Java 1.7 不支持该密码,但是,如果您有可能调整您的 java 安装,您可以添加安全提供程序。 步骤如下:

    1. 从 bouncycastle.org 下载 bcprov-ext-jdk15on-159.jar 和 bctls-jdk15on-159.jar 然后放到你的 jre/jdk 的 lib/ext 目录中(现在 159 是最新版本)
    2. 编辑 jre/jdk 的 lib/security/java.security 文件并添加以下行:
    • security.provider.1=org.bouncycastle.jce.provider.BouncyCastleProvider -security.provider.2=org.bouncycastle.jsse.provider.BouncyCastleJsseProvider
    1. 通过添加 2 来重枚举以下所有安全提供程序(因此 security.provider.1=sun.security.provider.Sun 变为 security.provider.3=sun.security.provider.Sun)

    就是这样,现在应该可以工作了

    【讨论】:

    • 在版本 161 中对我不起作用 - java.lang.IllegalArgumentException: 'protocols' 不能为空,或包含不受支持的协议
    • 它成功了,感谢您按照简单的说明进行操作。
    • 通过以下修改也为我工作。还需要在 lib/ext 中包含 bcutil jar。还需要设置 JVM arg -Djdk.tls.trustNameService=true 以进行证书验证。这是使用 Java 1.7 和充气城堡 1.70
    【解决方案3】:

    Oracle JDK 和 OpenJDK 在 java 8 中都开始支持 GCM 密码。

    【讨论】:

    【解决方案4】:

    AES-GCM 在 TLS v1.2 中可用。请参阅 [传输层安全 (TLS) 协议版本 1.2][1],第 6.2.3.3 节。 TLSv1.1 没有添加任何密码套件,并且 TLSv1.0 从来没有 AES-GCM 或椭圆曲线齿轮。 (椭圆曲线的东西也出现在 TLSv1.2 中)。

    Java 7 的最新公开版本 80

    • 在更改代码以在套接字编程情况下使用SSLContext.getInstance("TLSv1.2") 或在 HTTP 编程情况下仅声明-Dhttps.protocols=TLSv1.2 后支持 TLSv1.2。

    • 根据仅在 Java 7 的商业版本 191 中实现的请求,即使在 TLSv1.2 下也不支持 AES-GCM 密码套件,

      https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8180834

    有趣的是,TLS_ECDHE_ECDSA_* 密码套件出现在您的转储中,因为它们是 TLSv1.2 密码。

    【讨论】:

    • JSSE 参考指南的那部分可能不是最新的,但在本指南中多次引用了 Java 7 和 8 中对 TLS 1.2 的支持。
    • 谢谢布鲁诺。我只能按照供应商所说的进行。
    • 我猜他们已经有一段时间没有接触过介绍了。如果您在整个文档中搜索“1.2”,它会被多次提及。当然,真正重要的还有指南末尾附录 A 中“Oracle Provider Documentation”的链接(不一定突出...)
    • -1 我认为布鲁诺提到的应该包含在这个答案中,否则会产生误导。考虑到这是公认的答案,这尤其糟糕。
    【解决方案5】:

    我最近一直在搞乱 Java 和这个密码套件的废话。

    根据我的经验,您需要无限的策略文件才能获得一些额外的套件。我不记得如果使用这些会让你获得 GCM 密码,但从我对 IBM java 的回忆中,它至少让我获得了 AES256 位密码。

    这个link 表明您至少可以使用 TLSv1.2 初始化 SSLContext(因此您应该能够至少支持所有不需要无限管辖权策略文件的 TLSv1.2 密码套件)

    在我在 oracle 的密码套件列表中看不到任何 GCM 密码之前,先浏览一下我查看过的一些链接! orace-enabled/supported-cipher-suites.

    希望其中一些链接对您有所帮助!

    (我是在下班的时候打字的,如果我错过了任何 gcm 密码,请原谅我 :))

    【讨论】:

      猜你喜欢
      • 2017-07-08
      • 2016-10-14
      • 2018-08-23
      • 2023-04-01
      • 2016-05-12
      • 2012-12-24
      • 1970-01-01
      • 2017-03-05
      • 2015-03-27
      相关资源
      最近更新 更多