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

标签 java ssl encryption

我正在尝试使用协议(protocol) 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 文件:
  • 在 Java 8 u151/u152 中,策略文件包含在标准 Java 发行版中,但需要明确启用:Security.setProperty("crypto.policy", "unlimited");
  • 从 Java 8 u161+(以及所有即将推出的 Java 版本)开始,这些策略文件都包含在内,并且默认启用无限制加密策略。

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

    关于java - [不支持的密码套件][Java SSLSocket],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63612662/

    相关文章:

    java - 调整gridview和按钮的roe

    java - JDBC 参数 verifyServerCertificate=false 无需客户端 keystore 和信任库即可连接

    SSL 客户端验证失败

    encryption - golang中如何使用rsa key 对进行AES加解密

    c++ - 在 C++ 中加密/解密 ROT

    java - 通过LAN网络(java)发送和监听swing事件?

    java - Java中 'class'在哪里声明的?

    file - 在 Azure 中使用文件压缩/加密

    java - 如何从子文档的自定义方面访问 ElasticSearch 父文档字段

    c# - 带有 SSL 的 webHttpBinding 的 WCF 配置在负载均衡器处终止