Java keytool로 새로운 2048 비트 Diffie-Hellman 매개 변수를 생성하는 방법은 무엇입니까?


9

우리는 Diffie-Hellman 표준을 충족하도록 웹 서버 (JBoss-5.1.0.GA) 설정을 업데이트하려고 노력하는 비전문가입니다. https://weakdh.org/sysadmin.html 에서 테스트를 실행 한 후 "새 2048 비트 Diffie-Hellman 매개 변수를 생성해야합니다"라는 메시지가 표시됩니다. 과거에는 Java keytool을 사용하여 키를 생성했지만 Java keytool을 사용하여 새로운 2048 비트 Diffie-Hellman 매개 변수 생성에 대한 정보를 찾을 수 없었습니다. 누구 든지이 작업을 수행하는 방법을 알고 있거나 올바른 방향으로 우리를 가리킬 수 있습니까? 감사합니다!

답변:


13

keytool로는 그렇게 할 수 없습니다. 첫째, keytoolDH를 전혀 지원하지 않습니다. 둘째, keytool알고리즘에 대해 자체적으로 매개 변수를 생성하지 않으며 개인 키 / 키 쌍만 생성합니다. 때 셋째, keytool키 쌍을 생성 또한 (자체 서명 인증서를 생성 , 때로는 이후 "진짜"CA에서 발급 한 인증서로 대체됩니다)과 DH 서명하지 않기 때문에 그것은 DH에 대한 자체 서명 인증서를 생성하는 것은 불가능하다. 당신은 할 수 DH 매개 변수를 생성하는 매우 간단한 (약 10 라인) 자바 프로그램을 작성. 그러나 아마 다음과 같은 이유로 당신에게 좋지 않을 것입니다.

Java는 여기서 DHE 매개 변수를 허용하지 않습니다. JbossWS (Jboss 웹 서버, 나중에 Wildfly)는 Tomcat의 포크이며 일반적으로 SSL / TLS, JSSE의 Java 구현을 사용합니다. Java 7까지 JSSE는 768 비트 인 자체 DHE 매개 변수를 사용하며 이는 허용 할 수 없을 정도로 약합니다. (JSSE가 DH-512에 대한 RFC 요구 사항을 준수하는 EXPORT 제품군을 제외하고는 완전히 고장 났지만 EXPORT 제품군은 설계 상 완전히 고장 났으며 Java 7에서 기본적으로 비활성화되어 있습니다.) Java 8 JSSE를 사용하면 DHE 매개 변수 의 크기 를 제어 하지만 실제 값은 제어 하지 않습니다.

(일부 중복되는) 옵션은 다음과 같습니다.

Java 8에서 JSSE를 사용하십시오. Java 8에서 JSSE를 사용 하지만 초기는 아니지만 DHE의 기본값은 1024 비트입니다. weakdh.org는 그렇지 않은 경우에도 대부분의 기관이 충분히 강력하다고 간주하고 더 지정할 수 있습니다 ( https://docs.oracle.com 참조). /javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#customizing_dh_keys 및 배경 /programming/30352105/how-to-set-custom-dh-group-in-java -sslengine-to-prevent-logjam-attack . Java 8 이전에 Java 클라이언트 가있는 경우 서버가 1024 비트 이상의 DHE를 사용하면 클라이언트실패 합니다. 이 문제가있는 다른 클라이언트는 모르지만이 변경 사항을 적용하기 전에 테스트하십시오.

ECDHE를 활성화하십시오. Java 7 이상의 JSSE는 ECDHE를 구현합니다. ECDHE는 일반적으로 P-256을 사용하여 DHE와 같은 사전 계산이 적용되지 않으므로 충분히 강력합니다. (어떤 사람들은 신뢰하지 않지만 어떤 일반적으로 NIST는 NSA에 의해 영향을 받는다 때문에 내가 아는 어떤 오픈 소스 특히 ECC 곡선에 문제가 표시되지 않았지만, NIST의 ECC 곡선을.) 자바 6을 실제로 ECDHE의 JSSE 부분이있다 그러나 JVM에 ECC 프리미티브 용 암호화 "제공자"가있는 경우에만 활성화되며 Java 6에는 없습니다. bcprov - * -에서 jdk15on http://www.bouncycastle.org/는 당신이 단지를 추가하려면 그렇다면, ECC를 포함한 자바 암호 프리미티브의 범위에 대한 JCE 제공 업체입니다 JRE/lib/ext및 추가 org.bouncycastle.jce.provider.BouncyCastleProvider에있는 목록 JRE/lib/security/java.security(또는 적합 할Security.add/insertProvider()Java 6은 ECDHE를 수행 할 수 있습니다. 물론 Java 6을 계속 사용하고 있는지 여부는 자체적으로 문제입니다.

몇 년 전, 브라우저 및 기타 클라이언트에서 ECDHE에 대한 지원은 충분했지만 오늘날 AFAIK의 모든 최신 브라우저는이를 지원하고 이를 DHE보다 선호 합니다. 즉, 브라우저 hello는 DHE 제품군 앞에 ECDHE 제품군을 나열하므로 서버가 둘 다 구현하는 경우 ECDHE를 선택해야합니다. 브라우저가 아닌 클라이언트는 그렇지 않을 수도 있습니다. 확실하게 테스트하십시오.

DHE를 비활성화하십시오. DHE 암호를 제외하도록 커넥터 속성에서 암호 목록을 구성 할 수 있습니다. 당신이 있어도 쓸모없는 staticDH와 staticECDH도 제외하고 (단일) DES와 (모든) "EXPORT"가있는 경우 (Java 6). 즉, ECHDE를 수행하지 않는 브라우저와 클라이언트는 일반 RSA와 정방향 보안이 유지되지 않지만 최소한 "현재"비밀이 유지됩니다. 기억 나지 않지만 5.1 커넥터 구성은 여전히 ​​어딘가에 있다고 생각 $server/deploy/jbossweb/server.xml합니다.

네이티브를 사용해보십시오. JbossWS가 시작한 Tomcat에는 JSSE가 아닌 OpenSSL 인 "APR"이라는 "네이티브"를 사용하여 HTTPS (SSL / TLS)를 구현할 수있는 옵션이 있습니다. JbossWS에서이 옵션을 사용하는 데 여러 가지 성공을 거두었으며 5.1에 대해서는 생각 나지 않습니다. 경우 귀하의 JbossWS 실행 가능한 TC-기본 옵션을 가지고 있으며, 경우 는 DH 매개 변수를 구성 처리 할 수있는, 다음을 구성 할 DH 파라미터와 JbossWS - 기본 지침을 생성하려면 openssl을 사용합니다.


이 위대한 정보에 감사드립니다. 우리 의 대답 은 궁극적으로 keytool과 관련이 없으며 server.xml 파일의 변경 사항이지만이 답변을 확인하려고합니다.
user2072931

4

실제로 최신 Java 8 버전으로 사용자 지정 DHE 매개 변수 지정할 수 있습니다 . 이것은 JSSE TLS 구현을 사용하는 한 응용 프로그램의 독립입니다.

먼저 ( -Djdk.tls.ephemeralDHKeySize=1024또는 -Djdk.tls.ephemeralDHKeySize=2048) 를 사용하려면 DHE 키의 크기를 지정해야합니다 . 서버에서는 DHE에 대해 사전 정의 된 생성기 / 프라임 조합을 사용합니다. Java 8에서는 1024 또는 2048 만 사용할 수 있으므로 JDK 9는 더 큰 크기를 지원합니다 .

다른 조합을 제공하려면 jre / lib / security / Java.security에서 jdk.tls.server.defaultDHEParameterssecurity 특성을 사용하여 지정할 수 있습니다 (8u51부터). 매개 변수 목록 (사용 된 각 키 크기마다 하나씩)을 취하고 소수와 제너레이터 (일반적으로 2 또는 5)를 16 진수로 포함해야합니다.

openssl dhparam -out dhparam2048.pem 2048새 쌍을 생성하는 데 사용한 경우 openssl dhparam -noout -text -check -in dhparam2048.pem텍스트 모드에서 해당 파일을 읽고 인쇄하는 데 사용할 수 있습니다 . 텍스트를 복사하여 Java 보안 특성에 붙여 넣어야합니다 (openssl 16 진 표현 사이 tr -d ':'를 제거하는 데 사용 :)

다음은 샘플입니다 (1024 bis 만 해당).

>openssl dhparam -in p -check -text -noout | tr -d ':'
PKCS#3 DH Parameters: (1024 bit)
    prime:
       00f7a63b59edcc43a43df12077f0e9
        14129c20a73cef95f919896e608ebc
        8722776c948765bbbf61542e118329
        6c6ea74ecbded3a93aff77a062aba4
        fcf04fc01030e65077f5a802605058
        65b836368dd5ea389d77691fac0f2c
        f7a161c51c8e97ddecb3cf7f872b0c
        cfaf54373d5203edcabc575e871bb1
        107ec2f30c78ebf403
    generator: 2 (0x2)
DH parameters appear to be ok.

그리고이 결과

jdk.tls.server.defaultDHEParameters= \
    { \
        00f7a63b59edcc43a43df12077f0e9 \
        14129c20a73cef95f919896e608ebc \
        8722776c948765bbbf61542e118329 \
        6c6ea74ecbded3a93aff77a062aba4 \
        fcf04fc01030e65077f5a802605058 \
        65b836368dd5ea389d77691fac0f2c \
        f7a161c51c8e97ddecb3cf7f872b0c \
        cfaf54373d5203edcabc575e871bb1 \
        107ec2f30c78ebf403, 2 }

프로세스가 간단하지 않기 때문에 서버를 다시 시작하고 실제로 기본 값이 아닌이 프라임을 사용하는지 확인해야하므로 잘못 될 수 있습니다. 기본값은 source에 정의 되어 있으며 2048 비트의 프라임은 TLS FFDHE 초안입니다.

예를 들어 openssl s_client를 실행할 때 Java 8 JSSE Server에 연결할 때 1024 비트 소수 ( ffffff ffffffffffc90f ... 5381ffffffffffffffff )를 볼 수 있습니다 .

>openssl s_client -msg -cipher DHE-RSA-AES128-SHA256 -connect localhost:1234
...
<<< TLS 1.2 Handshake [length 018f], ServerKeyExchange
0c 00 01 8b 00 80 ff ff ff ff ff ff ff ff c9 0f
da a2 21 68 c2 34 c4 c6 62 8b 80 dc 1c d1 29 02
4e 08 8a 67 cc 74 02 0b be a6 3b 13 9b 22 51 4a
08 79 8e 34 04 dd ef 95 19 b3 cd 3a 43 1b 30 2b
0a 6d f2 5f 14 37 4f e1 35 6d 6d 51 c2 45 e4 85
b5 76 62 5e 7e c6 f4 4c 42 e9 a6 37 ed 6b 0b ff
5c b6 f4 06 b7 ed ee 38 6b fb 5a 89 9f a5 ae 9f
24 11 7c 4b 1f e6 49 28 66 51 ec e6 53 81 ff ff
ff ff ff ff ff ff 00 01 02 ...

이 대신 설치시 사용자 정의 매개 변수가 표시되어야합니다.

Java 7 (768 비트)의 기본 매개 변수는 ParameterCache에 정의 된대로 긴 생성기 "30470ad..529252"의 경우 "e9e642 ... 7a3daf" 입니다.


3

나는이 같은 문제를 겪었지만 Glassfish에서 왔습니다.

먼저 JBoss 서버 앞에 일종의 리버스 프록시를 배치하여 암호 / 인증서 보안과 실행중인 Java 버전 사이의 링크를 제거하는 것이 좋습니다.

768 비트보다 큰 Ephemeral DH 키 길이를 얻으려면 Java 8에서 실행해야합니다. 1024는 새로운 기본값이며 jdk.tls.ephemeralDHKeySize(세부 : DH 키 사용자 정의)를 사용하여 최대 2048 개까지 이동할 수 있습니다 . 내가 찾을 수 있듯이 Java에서 주요 매개 변수를 별도로 재생성한다는 개념은 없습니다.


대안의 제안에 감사드립니다. 우리는 앞으로 이것을 살펴볼 수 있습니다.
user2072931

서버가 있습니다. serverfault.com/a/798036/4591
eckes

glassfish / payara / payara-micro에서 DHE 암호를 비활성화 <ssl tls-enabled="false" classname="com.sun.enterprise.security.ssl.GlassfishSSLImpl" tls11-enabled="false" cert-nickname="s1as" ssl3-tls-ciphers="+TLS_RSA_WITH_AES_256_CBC_SHA,+TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,+TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA256,+TLS_ECDH_RSA_WITH_AES_256_CBC_SHA256,+TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,+TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,+TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA256,+TLS_ECDH_RSA_WITH_AES_256_GCM_SHA256"></ssl>하여 <protocol name="http-listener-2" security-enabled="true">SSL 커넥터에 추가
Markus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.