OpenSSL : DH 매개 변수 표시 diffie hellman 키 교환에 의존하는 SSL 암호를

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

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



답변

명령 줄 스위치를 사용하기는 쉽지 않지만 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에서 수정 됨) .


답변

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-----

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