OpenSSL: Tampilkan Parameter DH

15

Saat menggunakan SSL Cipher bergantung pada pertukaran kunci hellman diffie, ukuran kunci pribadi yang digunakan adalah sangat penting untuk keamanan pertukaran kunci itu.

Ketika saya terhubung ke server menggunakan alat "openssl s_client", bagaimana saya bisa menanyakan parameter DH yang digunakan?


sumber

Jawaban:

17

Saya tidak tahu tentang saklar baris perintah yang mudah digunakan, tetapi di openssl s_clientbaris perintah, Anda dapat menambahkan -msgopsi untuk mendapatkan dump heksadesimal dari pesan jabat tangan. Kemudian cari ServerKeyExchangepesannya; seharusnya terlihat seperti ini:

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

dan bunyinya seperti itu:

  • 0c 00 03 0b: pesan tipe "ServerKeyExchange" (itulah "0c") dengan panjang 0x00030B byte.
  • Elemen pertama adalah modulus DH sebagai bilangan bulat besar, dengan header panjang dua byte. Di sini, panjangnya disandikan sebagai 01 00, artinya bilangan bulat disandikan lebih dari 0x0100 byte. Itu 256 byte, sehingga modulus memiliki panjang antara 2041 dan 2048 bit.
  • Bytes modulus mengikuti, dalam urutan big-endian yang tidak ditandatangani. Bytes teratas dari modulus itu adalah, dalam hal ini ff ff ff ff...,. Modulusnya kemudian memiliki panjang persis 2048 bit.

Jika Anda menggunakan paket sandi ECDHE (kurva eliptik), ServerKeyExchangetentu saja formatnya berbeda.

Lihat standar untuk definisi ServerKeyExchangepesan. Untuk suite cipher DHE, ini berisi modulus p , generator g dan server DH kunci publik y , dalam urutan itu, masing-masing dinyatakan sebagai bilangan bulat besar dalam format yang dijelaskan di atas (header 16-bit yang berisi panjang dalam byte, kemudian bilangan bulat nilai dalam pengkodean big-endian yang tidak ditandatangani).

Versi OpenSSL baru-baru ini cenderung untuk memilih ukuran DH modulus yang pertandingan (dari sudut pandang keamanan) kekuatan pasangan kunci server (digunakan untuk menandatangani dengan ServerKeyExchangepesan). Dalam contoh di atas, server memiliki kunci RSA 2048-bit, sehingga OpenSSL memilih untuk menggunakan modulus DH 2048-bit (dalam hal ini, modulus terkenal yang dijelaskan dalam RFC 3526, bagian 3 ).

Beberapa server lain tetap menggunakan grup DH 1024-bit untuk memastikan kompatibilitas dengan beberapa klien yang sudah ada yang tidak mendukung grup DH yang lebih besar (pelaku terbesar adalah implementasi SSL di Jawa, diperbaiki di Java 8 build 56 pada 2012). Kelemahan yang diketahui dalam protokol TLS, untuk suite cipher DHE, adalah bahwa klien tidak memiliki cara untuk menentukan ukuran modulus apa yang mungkin didukung (ini diperbaiki untuk ECDHE, karena klien dapat menentukan daftar kurva yang tepat yang diterimanya) .

Thomas Pornin
sumber
1
OpenSSL tidak memilih DHE secara otomatis, tetapi panggilan balik aplikasi dapat. OpenSSL 1.0.2 (Jan. 2015) secara opsional dapat memilih otomatis ECDHE , dan juga di 1.0.2 s_clientselalu menampilkan "Temp server key" DH & ukuran atau ECDH & kurva jika berlaku, tepat sebelum "jabat tangan telah membaca x dan ditulis y", sehingga Anda tidak lagi memerlukan untuk memecahkan kode itu. Apache mod_ssl baru-baru ini yang memilih DHE secara otomatis: httpd.apache.org/docs/trunk/mod/mod_ssl.html#sslcertificatefile (yang mencatat masalah tentang klien Java).
dave_thompson_085
Saya menggunakan 1.0.1e openssl dan saya tidak mendapatkan ServerKeyExchangedengan 0c 00 03 0b. dapatkah Anda memberikan perintah yang tepat untuk mendapatkan output? Saya tidak memiliki Handshakes yang dimulai dengan0c
rubo77
Jika suite sandi yang dipilih oleh server bukan suite sandi "DHE" atau "ECHDE", maka tidak akan ada pesan ServerKeyExchange.
Thomas Pornin
Saya mendapatkan <<< TLS 1.2 Handshake [panjang 01cd], ServerKeyExchange 0c 00 01 c9 03 00 17 41 04 08 5f 82 88 1e e5 b6 diikuti oleh 443 oktet yang sesuai dengan panjang 0x1c9 mulai dari oktet kelima. Namun "0300" tampaknya berarti 768 oktet sementara saya merasa yakin param DH saya "hanya" 2048 bit.
Law29
1
@ Law29 Ini lebih terlihat seperti ECDHE ServerKeyExchange. Jika menggunakan kurva eliptik, maka "03" berarti "ini adalah kurva bernama, dua byte berikutnya menyandikan pengidentifikasi kurva". Kemudian "00 17" adalah pengidentifikasi kurva, yaitu NIST P-256 (kurva yang paling banyak digunakan untuk ECDHE). Kemudian "41" adalah panjang titik publik, yang merupakan nilai tepat untuk titik P-256 dalam format yang tidak terkompresi; titik seperti itu akan dimulai dengan nilai byte 0x04, dan itulah yang Anda miliki. Singkatnya: tampaknya jabat tangan TLS 1.2 Anda benar-benar menggunakan ECDHE, bukan DHE.
Thomas Pornin
9

Jika Anda memiliki sertifikat dalam format PEM, Anda dapat mencoba perintah ini, itu akan memberi Anda output yang tepat dari perintah openssl.

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

(Output sampel)
    Parameter PKCS # 3 DH: (512 bit)
        utama:
            xx: xx: xx: xx
            xx: xx: xx: xx
            xx: xx: xx: xx
        generator: 2 (0x2)
Parameter DH tampaknya ok.
----- PARAMETER BEGIN DH -----
XXXX
XXXX
----- AKHIR PARAMETER DH -----

Semoga ini yang Anda cari.

David Loh
sumber