繁体   English   中英

[不支持的密码套件][Java SSLSocket]

[英][Unsupported ciphersuite][Java SSLSocket]

我正在尝试使用协议 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);
    }
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM