java版“1.7.0_171”支持ciphersuite TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

时间:2018-05-03 09:41:39

标签: java encryption https

我使用的是java版

java version "1.7.0_171"
OpenJDK Runtime Environment (amzn-2.6.13.0.76.amzn1-x86_64 u171-b01)
OpenJDK 64-Bit Server VM (build 24.171-b01, mixed mode)

当我尝试拨打HHTPS时,我得到exception

java.lang.IllegalArgumentException: Unsupported ciphersuite TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
    at sun.security.ssl.CipherSuite.valueOf(CipherSuite.java:235)
    at sun.security.ssl.CipherSuiteList.<init>(CipherSuiteList.java:82)
    at sun.security.ssl.SSLSocketImpl.setEnabledCipherSuites(SSLSocketImpl.java:2413)
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:384)
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:353)
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:134)

使用TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

的服务器ssl连接

这是服务器信息

* TCP_NODELAY set
* Connected to api..... (1xx.2xx.1xx.1xx) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* ALPN, server accepted to use http/1.1
* SSL connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
* Server certificate:
*   subject: CN=api.....
*   start date: Apr 27 09:29:11 2018 GMT
*   expire date: Jul 26 09:29:11 2018 GMT
*   common name: api.server1.ih.testenv.io
*   issuer: CN=Let's Encrypt Authority X3,O=Let's Encrypt,C=US
> GET / HTTP/1.1
> Host: api.server1.ih.testenv.io
> User-Agent: curl/7.53.1
> Accept: */*
> 
< HTTP/1.1 404 Not Found
< Server: nginx/1.10.3 (Ubuntu)
< Date: Thu, 03 May 2018 08:43:05 GMT
< Content-Type: application/json; charset=utf-8
< Content-Length: 39
< Connection: keep-alive
< cache-control: max-age=0, private, must-revalidate
< x-request-id: 2klhbq0t5ahtlndlmc0003k2

我怎么能支持这个密码?

编辑:我无法升级到java 8

2 个答案:

答案 0 :(得分:4)

问题是Java 7中的默认安全提供程序不支持TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384和大多数其他GCM密码套件。在Java 8中添加了对这些密码套件的支持。

您可以在此处比较Java 7Java 8的规范和支持的密码套件,以便进行确认。

由于您的编辑建议您此时无法升级到Java 8,除了使用外部安全提供程序之外,我认为您没有多少选择。

一个例子是

  

Bouncy Castle Java加密API的军团

包括JCE和JCA的安全提供程序。使用外部安全提供程序显然意味着要处理他们的许可模式,对于Bouncy Castle而言,这很简单,因为他们使用了稍微改编的MIT许可证版本。

有很好的教程如何更改Java的默认安全提供程序,快速搜索应该有帮助。

答案 1 :(得分:1)

为了调试此问题,请尝试在运行客户端应用程序时添加“-Djavax.net.debug = ssl”。

java -Djavax.net.debug=ssl com.sample.Test

或使用OpenSSL的命令行:

openssl s_client -cipher 'TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384' -connect api.server:443

如果您可以控制/访问服务器,请尝试在服务器端添加此密码。

如果您使用的是NGinx:     How to add ssl cipher to ssl_ciphers in nginx

注意

  

在某些环境中,某些算法或密钥长度可能是   使用SSL / TLS时不合需要。本节介绍该机制   用于在SSL / TLS安全性参数期间禁用算法   协商,包括协议版本协商,密码套件   选择,对等身份验证和密钥交换机制。

  • 要确定属性“jdk.certpath.disabledAlgorithms”的默认值和语法,请检查“jre / lib / security / java.security”文件

请同时查看此主题here