[지원되지 않는 ciphersuite] [Java SSLSocket]

Aug 27 2020

프로토콜 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에서 JCE (Java Cryptography Extension) Unlimited Strength Jurisdiction Policy Files 8을 교체하려고했지만 여전히 서버에 연결할 수 없습니다.

URL : 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);
    }
}

답변

1 PeterWalser Aug 27 2020 at 16:20

다음을 사용하여 지원되는 암호 그룹을 나열 할 수 있습니다.

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.