OpenSSL : DH 매개 변수 표시


14

diffie hellman 키 교환에 의존하는 SSL 암호를 사용할 때, 사용 된 개인 키의 크기는 해당 키 교환의 보안에 매우 중요합니다.

"openssl s_client"도구를 사용하여 서버에 연결하면 사용 된 DH 매개 변수를 어떻게 쿼리 할 수 ​​있습니까?

답변:


16

명령 줄 스위치를 사용하기는 쉽지 않지만 openssl s_client 명령 줄을 추가하면 -msg 옵션을 사용하여 핸드 셰이크 메시지의 16 진수 덤프를 가져옵니다. 그런 다음 ServerKeyExchange 메시지; 그것은 다음과 같이 보일 것입니다.

<<< TLS 1.2 Handshake [length 030f], ServerKeyExchange
    0c 00 03 0b 01 00 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
    (...)

그런 식으로 읽습니다.

  • 0c 00 03 0b: 길이가 0x00030B 바이트 인 "ServerKeyExchange"( "0c"유형) 메시지입니다.
  • 첫 번째 요소는 길이가 2 바이트 인 큰 정수로 DH 계수입니다. 여기에서 길이는 다음과 같이 인코딩됩니다. 01 000x0100 바이트 이상으로 인코딩 된 정수를 의미합니다. 256 바이트이므로 모듈러스 길이는 2041 ~ 2048 비트입니다.
  • modulus 바이트는 부호없는 빅 endian 순서로 따라옵니다. 해당 모듈의 최상위 바이트는이 경우, ff ff ff ff.... 그런 다음 계수의 길이는 정확히 2048 비트입니다.

ECDHE 암호 모음 (타원 곡선)을 사용하면 ServerKeyExchange 물론 형식이 다릅니다.

만나다 표준 의 정의를 위해 ServerKeyExchange 메시지. DHE 암호 스위트의 경우, 모듈러스 , 발전기 및 서버 DH 공개 키 와이 그 순서로, 위에서 설명한 형식의 큰 정수 (길이가 바이트로 된 16 비트 헤더, 부호없는 빅 엔디안 인코딩의 정수 값)로 표현됩니다.

최근의 OpenSSL 버전은 (보안 관점에서 볼 때) 서버의 키 쌍의 강도와 일치하는 DH 모듈러스 크기를 선택하는 경향이 있습니다. 기호 그만큼 ServerKeyExchange 메시지). 위의 예에서 서버는 2048 비트 RSA 키를 가지고 있으므로 OpenSSL은 2048 비트 DH 계수를 사용하도록 선택되었습니다 (이 경우에 설명 된 잘 알려진 모듈법 RFC 3526, 섹션 3 ).

일부 다른 서버는 큰 DH 그룹을 지원하지 않는 기존 클라이언트와의 호환성을 보장하기 위해 1024 비트 DH 그룹에 고정됩니다 (가장 큰 위반자는 Java에서 SSL 구현이며 고정 Java 8 빌드 56 2012 년에). DHLS 암호 스위트의 TLS 프로토콜의 알려진 결함은 클라이언트가 지원할 수있는 모듈러스 크기를 지정할 방법이 없다는 것입니다 (클라이언트가 허용하는 정확한 곡선 목록을 지정할 수 있기 때문에 ECDHE에서 수정 됨) .


1
OpenSSL DHE를 자동 선택하지 않지만 앱 콜백이 가능합니다. OpenSSL 1.0.2 (2015 년 1 월) 선택적으로 자동 선택 가능 ECDHE 1.0.2에서도 s_client "핸드 셰이크가 x를 읽고 y를 쓰는"직전에 "Temp server key"DH & amp; size 또는 ECDH & curve를 항상 표시하므로 더 이상 디코딩 할 필요가 없습니다. 최근입니다. 아파치 mod_ssl 그건 자동 선택 DHE : httpd.apache.org/docs/trunk/mod/mod_ssl.html#sslcertificatefile (Java 클라이언트에 관한 문제점을 언급 함).
dave_thompson_085

나는 openssl 1.0.1e를 사용하고 아무 것도 얻지 못한다. ServerKeyExchange0c 00 03 0b. 출력을 얻기 위해 정확한 명령을 제공 할 수 있습니까? 나는 시작하는 악수가 하나도 없다. 0c
rubo77

서버가 선택한 암호 군이 "DHE"또는 "ECHDE"암호 군이 아니면 ServerKeyExchange 메시지가 없습니다.
Thomas Pornin

나는 & lt; & lt; & lt; TLS 1.2 핸드 셰이크 [길이 01cd], ServerKeyExchange 0c 00 01 c9 03 00 17 41 04 08 5f 82 88 1e e5 b6 다음에 다섯 번째 옥텟에서 시작하는 0x1c9의 길이에 해당하는 443 옥텟이옵니다. 그러나 "0300"은 768 옥텟을 의미하는 반면 내 DH 매개 변수는 "유일한"2048 비트입니다.
Law29

1
@ Law29 이것은 ECDHE ServerKeyExchange와 비슷합니다. 타원 곡선을 사용하는 경우 "03"은 "이것은 명명 된 곡선이고 다음 두 바이트는 곡선 식별자를 인코딩합니다"를 의미합니다. 그런 다음 "00 17"은 NIST P-256 (ECDHE에서 가장 많이 사용되는 곡선) 인 곡선 식별자입니다. 그런 다음 "41"은 P - 256 포인트의 압축되지 않은 형식의 정확한 값인 공개 지점 길이입니다. 그러한 포인트는 값 0x04의 바이트로 시작하며, 이는 정확하게 가지고있는 것입니다. 요약하면 TLS 1.2 핸드 셰이크는 DHE가 아니라 ECDHE를 사용하는 것 같습니다.
Thomas Pornin

8

PEM 형식의 인증서를 가지고 있다면이 명령을 시도해 볼 수 있습니다. 그러면 Openssl 명령으로 올바른 결과를 얻을 수 있습니다.

openssl dhparam -inform PEM -in ./imapd.pem -check -text

(Sample output)
    PKCS#3 DH Parameters: (512 bit)
        prime:
            xx:xx:xx:xx
            xx:xx:xx:xx
            xx:xx:xx:xx
        generator: 2 (0x2)
DH parameters appear to be ok.
-----BEGIN DH PARAMETERS-----
XXXX
XXXX
-----END DH PARAMETERS-----

희망이 당신이 찾고있는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.