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

根据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?

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

据我所知,Java 7不支持该协议。 从Java安全套接字扩展(JSSE)参考指南 (在JDK8文档下):

JSSE API能够支持SSL版本2.0和3.0以及TLS版本1.0。 这些安全协议封装了普通的双向流套接字,JSSE API增加了对身份validation,加密和完整性保护的透明支持。 JDK附带的JSSE实现支持SSL 3.0和TLS 1.0。 它没有实现SSL 2.0。

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

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

这些已在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 ********* 

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

  • 对于OpenJDK,请参阅JEP 115:AEAD CipherSuites
  • 对于Oracle JDK,请参阅JDK 8的JDK 8安全增强和Java加密体系结构Oracle Providers文档

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

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

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

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

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

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

正如其他人所说,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)

这就是全部,现在应该可以了