[Unsupported ciphersuite][Java SSLSocket]

Posted

技术标签:

【中文标题】[Unsupported ciphersuite][Java SSLSocket]【英文标题】: 【发布时间】:2020-12-16 03:23:04 【问题描述】:

我正在尝试使用协议 TLSv1.2 通过 SSLSocket 连接服务器。服务器仅支持以下密码。

ECDHE-ECDSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-ECDSA-AES128-SHA256

当我尝试设置启用的密码套件时,我面临以下异常:

java.lang.IllegalArgumentException: Unsupported ciphersuite ECDHE-ECDSA-AES128-GCM-SHA256
at sun.security.ssl.CipherSuite.valueOf(Unknown Source) ~[?:1.8.0_74]
at sun.security.ssl.CipherSuiteList.<init>(Unknown Source) ~[?:1.8.0_74]
at sun.security.ssl.SSLSocketImpl.setEnabledCipherSuites(Unknown Source) ~[?:1.8.0_74]

我曾尝试从 C:\Program Files\Java\jdk1.8.0_92\jre\lib\security 上的以下 URL 替换 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8 但仍然无法连接服务器。

网址: https://www.oracle.com/java/technologies/javase-jce8-downloads.html

我正在使用以下代码创建 SSLSocket:

protected void openSocket() throws IOException 
    LGR.info("Opening SSL socket to " + addr + ":" + port);
    String[] TLS_SUPPORTED_VERSIONS = new String[]  "TLSv1.2" ;
    String[] CIPHER_SUITES = new String[]  "ECDHE-ECDSA-AES128-GCM-SHA256", "ECDHE-RSA-AES128-GCM-SHA256", "ECDHE-ECDSA-AES128-SHA256" ;
    try 
        SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket(addr, port);
        socket.setEnabledProtocols(TLS_SUPPORTED_VERSIONS);
        socket.setEnabledCipherSuites(CIPHER_SUITES);
        
     catch (Exception ex) 
        LGR.error("##Exception##", ex);
     catch (Throwable ex) 
        LGR.error("##Throwable##", ex);
    

【问题讨论】:

您可以使用使用Bouncy Castle 代替默认的JCE。 【参考方案1】:

您可以使用以下命令列出支持的密码套件:

SSLSocketFactory socketFactory = SSLContext.getDefault().getSocketFactory();
for (String cipherSuite : socketFactory.getSupportedCipherSuites()) 
    System.out.println(cipherSuite);

以下条目与您请求的套件匹配:TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

您不再需要 JCE Unlimited Strength Jurisdiction Policy Files:

在 Java 8 u151/u152 中,策略文件包含在标准 Java 发行版中,但需要明确启用:Security.setProperty("crypto.policy", "unlimited"); 从 Java 8 u161+(以及所有即将推出的 Java 版本)开始,这些策略文件都包含在内,并且默认启用无限制加密策略。

您可以按如下方式进行验证: 当启用无限强度时,Cipher.getMaxAllowedKeyLength("AES") 应该返回 Integer.MAX_VALUE

【讨论】:

我不知道这些密码在 OpenSSL 中,我必须使用相关的 IANA 密码。但现在我收到“连接重置”错误。我试图启用调试并找到以下几行。线程 8,处理异常:java.net.SocketException:连接重置 %% 无效:[Session-1,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256] 线程 8,发送 TLSv1.2 警报:致命,描述 = 意外消息线程 8,写入:TLSv1.2警报,长度 = 2 线程 8,异常发送警报:java.net.SocketException:连接由对等方重置:套接字写入错误线程 8,调用 closeSocket() 当 TLS 握手失败(客户端和服务器之间没有相互支持的密码套件,没有相互支持的 TLS 版本,或者更有可能:无效的 X509 证书)时,连接将立即终止。对端重置连接意味着另一端关闭了连接。使用 OpenSSL 或在 Java 中使用 -Djavax.net.debug=ssl 进行调试可能有助于找到原因。 感谢您的帮助。非常感谢。

以上是关于[Unsupported ciphersuite][Java SSLSocket]的主要内容,如果未能解决你的问题,请参考以下文章

Salesforce 返回“unsupported_grant_type”

[问题解决]Python locale error: unsupported locale setting

Spring 发送 JSON 数据提示 Unsupported Media Type 错误 “status“: 415, “error“: “Unsupported Media Type

Spring 发送 JSON 数据提示 Unsupported Media Type 错误 “status“: 415, “error“: “Unsupported Media Type

Unsupported major.minor version 51.0解决办法

安装 $npm 后,出现错误:找不到模块 '../lib/utils/unsupported.js'