ssl - 从 java.security 文件中删除 3DES_EDE_CBC 如何允许使用 RC4-MD5 密码对服务器进行 HTTPS 调用?

标签 ssl https java-8 openssl java-security

当使用 Apache HttpClient 的 Java 8 客户端代码调用 https 服务器时,我们看到以下错误。

javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1002)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)
    at org.apache.http.conn.ssl.SSLSocketFactory.createLayeredSocket(SSLSocketFactory.java:573)
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:557)
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:414)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)
    at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:326)
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:610)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:445)
    at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:835)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
    at HttpClient.main(HttpClient.java:64)
Caused by: java.io.EOFException: SSL peer shut down incorrectly
        at sun.security.ssl.InputRecord.read(InputRecord.java:505)
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983)
        ... 14 more

发现服务器有 RC4-MD5 密码,由于 Java 8 不支持,所以出现此错误。 这是在目标 https 服务器上运行“openssl s_client -tls1 -connect :443”后的结果。

New, TLSv1/SSLv3, Cipher is RC4-MD5
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1
    Cipher    : RC4-MD5

所以我在 JVM 的“java.secuity”文件中编辑了 jdk.tls.disabledAlgorithms 属性。我从此条目中删除了选项“3DES_EDE_CBC”。

旧属性值:

jdk.tls.disabledAlgorithms=SSLv3, MD5withRSA, DH keySize < 1024, \
    EC keySize < 224, DES40_CBC_40, 3DES_EDE_CBC

编辑后的属性值:

jdk.tls.disabledAlgorithms=SSLv3, MD5withRSA, DH keySize < 1024, \
    EC keySize < 224, DES40_CBC_40

编辑 java.security 文件后,Java HTTPS 调用开始工作。

问题:如何从已禁用的算法中删除“3DES_EDE_CBC”算法才能使此 HTTPS 调用正常工作?我怎样才能更好地理解这一点?谢谢。

最佳答案

服务器通常支持多个密码套件。服务器很可能至少支持 RC4 和 3DES,因此在您的客户端中启用 3DES 足以找到通用密码。

关于ssl - 从 java.security 文件中删除 3DES_EDE_CBC 如何允许使用 RC4-MD5 密码对服务器进行 HTTPS 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51993326/

相关文章:

ssl - 我可以使用什么安全协议(protocol)来保护 Web 服务 (SSL/TLS)?

c# - IIS下如何填充系统证书?

python - 有效证书的 SSL 错误(错误握手)| Elasticsearch 和 Python

java - 如何将流与干扰方法和构造函数一起使用,为什么不使用 .peek()?

python - 如何在没有 Apache 和 Nginx 的情况下将所有 HTTP 请求重定向到 ELB 中的 HTTPS

apache - 如何使用 Apache 重定向对 Node-Red 的请求?

javascript - 网络套接字握手。从 ws 到 wss

java - 在代理服务器中建立 HTTPS 连接时出现问题。(CONNECT 方法)

Java 8 流 - 按最大重复降序排序

Java 8 流 : Defining collectors based on other collectors