我使用的是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
这是服务器信息
* 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
答案 0 :(得分:4)
问题是Java 7中的默认安全提供程序不支持TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
和大多数其他GCM
密码套件。在Java 8中添加了对这些密码套件的支持。
您可以在此处比较Java 7和Java 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安全性参数期间禁用算法 协商,包括协议版本协商,密码套件 选择,对等身份验证和密钥交换机制。
请同时查看此主题here: