在SSL / TLS中支持AES-GCM的Java 7?

时间:2014-01-22 17:03:41

标签: java security ssl aes

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

  1. ibm java 7
  2. java 7 ssl doc
  3. 由于将其限制为仅仅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?

5 个答案:

答案 0 :(得分:13)

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 ********* 

答案 1 :(得分:4)

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

答案 2 :(得分:1)

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

根据我的经验,您需要无限制的政策文件才能获得额外的套房。如果使用那些可以获得GCM密码的话,我记不清了我的头脑,但是从我对IBM java的回忆中它至少得到了AES256位密码。

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

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

希望其中一些链接可以帮到你!

(我正在用完工作时输入这个,所以请原谅我,如果我错过任何gcm密码:))

答案 3 :(得分:1)

正如其他人所说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
  3. 通过添加1来重新计算以下所有安全提供程序(因此security.provider.1 = sun.security.provider.Sun变为security.provider.3 = sun.security.provider.Sun)
  4. 这就是全部,现在应该可以正常工作

答案 4 :(得分:0)

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

Java 7的最新公共版本80

  • 在更改代码后支持TLSv1.2以便在套接字编程时使用SSLContext.getInstance("TLSv1.2")或仅在HTTP编程时声明-Dhttps.protocols=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密码。