OpenSSL: Hiển thị thông số DH


14

Khi sử dụng Mật mã SSL dựa trên trao đổi khóa địa ngục diffie, kích thước của khóa riêng được sử dụng là rất quan trọng đối với tính bảo mật của trao đổi khóa đó.

Khi tôi kết nối với máy chủ bằng công cụ "openssl s_client", làm cách nào tôi có thể truy vấn các tham số DH được sử dụng?

Câu trả lời:


17

Tôi không biết về một công tắc dòng lệnh dễ sử dụng, nhưng trong openssl s_clientdòng lệnh, bạn có thể thêm -msgtùy chọn để nhận được kết xuất thập lục phân của thông báo bắt tay. Sau đó tìm ServerKeyExchangetin nhắn; Nó sẽ giống như thế này:

<<< 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
    (...)

và nó đọc theo cách đó:

  • 0c 00 03 0b: thông báo thuộc loại "ServerKeyExchange" (đó là "0c") có độ dài 0x00030B byte.
  • Phần tử đầu tiên là mô đun DH là một số nguyên lớn, với tiêu đề có độ dài hai byte. Ở đây, độ dài được mã hóa thành 01 00, có nghĩa là một số nguyên được mã hóa trên 0x0100 byte. Đó là 256 byte, vì vậy mô-đun có độ dài từ 2041 đến 2048 bit.
  • Các byte mô-đun theo sau, theo thứ tự lớn không dấu. Các byte trên cùng của mô đun đó, trong trường hợp này , ff ff ff ff.... Mô-đun sau đó có độ dài chính xác 2048 bit.

Tất nhiên, nếu bạn sử dụng bộ mật mã ECDHE (đường cong elip), thì ServerKeyExchangeđịnh dạng sẽ khác.

Xem tiêu chuẩn cho định nghĩa của ServerKeyExchangetin nhắn. Đối với DHE bộ mã hoá, nó có chứa các module p , máy phát điện g và máy chủ DH khóa công khai y , theo thứ tự, mỗi thể hiện dưới dạng một số nguyên lớn trong các định dạng mô tả ở trên (tiêu đề 16-bit có chứa chiều dài tính bằng byte, sau đó số nguyên giá trị trong mã hóa lớn cuối không dấu).

Các phiên bản gần đây OpenSSL có xu hướng chọn một kích thước DH mô đun phù hợp (từ một điểm bảo mật của xem) sức mạnh của cặp khóa của máy chủ (sử dụng để đăng ký các ServerKeyExchangethông báo). Trong ví dụ trên, máy chủ có khóa RSA 2048 bit, do đó OpenSSL đã chọn sử dụng mô đun DH 2048 bit (trong trường hợp này là mô đun nổi tiếng được mô tả trong RFC 3526, phần 3 ).

Một số máy chủ khác dính vào các nhóm DH 1024 bit để đảm bảo khả năng tương thích với một số máy khách hiện tại không hỗ trợ các nhóm DH lớn hơn (người phạm tội lớn nhất là việc triển khai SSL trong Java, được sửa trong Java 8 build 56 vào năm 2012). Một lỗ hổng đã biết trong giao thức TLS, đối với các bộ mật mã DHE, là máy khách không có cách nào để xác định kích thước mô đun mà nó có thể hỗ trợ (điều này được sửa cho ECDHE, vì máy khách có thể chỉ định danh sách chính xác các đường cong mà nó chấp nhận) .


1
OpenSSL không tự động chọn DHE, nhưng có thể gọi lại ứng dụng. OpenSSL 1.0.2 (tháng 1 năm 2015) có thể tùy chọn autoselect ECDHE , và cũng có trong 1.0.2 s_clientluôn hiển thị "chìa khóa máy chủ Temp" DH & kích thước hoặc ECDH & đường cong khi áp dụng, chỉ cần trước khi "bắt tay đã đọc x và y bằng văn bản", vì vậy bạn không còn cần để giải mã nó. Đây là mod_ssl Apache gần đây tự động chọn DHE: httpd.apache.org/docs/trunk/mod/mod_ssl.html#sslcert vefile (lưu ý vấn đề về các máy khách Java).
dave_thndry_085

Tôi sử dụng openssl 1.0.1e và tôi không nhận được bất kỳ ServerKeyExchangevới 0c 00 03 0b. bạn có thể cung cấp lệnh chính xác để có được đầu ra? Tôi không có cái bắt tay nào bắt đầu bằng0c
rubo77

Nếu bộ mật mã được máy chủ chọn không phải là bộ mật mã "DHE" hoặc "ECHDE", thì sẽ không có thông báo ServerKeyExchange.
Thomas Pornin

Tôi nhận được <<< TLS 1.2 Bắt tay [chiều dài 01cd], ServerKeyExchange 0c 00 01 c9 03 00 17 41 04 08 5f 82 88 1e e5 b6 theo sau là 443 octet tương ứng với độ dài 0x1c9 bắt đầu từ octet thứ năm. Tuy nhiên "0300" dường như có nghĩa là 768 octet trong khi tôi cảm thấy chắc chắn thông số DH của tôi chỉ "2048 bit".
Luật29

1
@ Law29 Cái này trông giống như một ServerKeyExchange của ECDHE. Nếu sử dụng đường cong elip, thì "03" có nghĩa là "đây là một đường cong có tên, hai byte tiếp theo mã hóa định danh đường cong". Thì "00 17" là định danh đường cong, là NIST P-256 (đường cong được sử dụng nhiều nhất cho ECDHE). Thì "41" là độ dài điểm công khai, chính xác là giá trị đúng cho điểm P-256 ở định dạng không nén; một điểm như vậy sẽ bắt đầu bằng một byte có giá trị 0x04 và đó chính xác là những gì bạn có. Tóm lại: có vẻ như cái bắt tay TLS 1.2 của bạn thực sự sử dụng ECDHE chứ không phải DHE.
Thomas Pornin

8

Nếu bạn có chứng chỉ ở định dạng PEM, bạn có thể thử lệnh này, nó sẽ cung cấp cho bạn một đầu ra thích hợp từ lệnh Openssl.

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

(Sản lượng mẫu)
    Thông số PKCS # 3 DH: (512 bit)
        nguyên tố:
            xx: xx: xx: xx
            xx: xx: xx: xx
            xx: xx: xx: xx
        máy phát điện: 2 (0x2)
Thông số DH xuất hiện là ok.
----- BEGIN DH PARAMETERS -----
XXXX
XXXX
----- KẾT THÚC ĐẠI DIỆN -----

Hy vọng đây là những gì bạn đang tìm kiếm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.