OpenSSL: แสดงพารามิเตอร์ DH


15

เมื่อใช้ SSL Ciphers โดยอาศัยการแลกเปลี่ยนคีย์ที่แตกต่างกันขนาดของคีย์ส่วนตัวที่ใช้นั้นมีความสำคัญอย่างยิ่งต่อความปลอดภัยของการแลกเปลี่ยนคีย์นั้น

เมื่อฉันเชื่อมต่อกับเซิร์ฟเวอร์โดยใช้เครื่องมือ "openssl s_client" ฉันจะค้นหาพารามิเตอร์ DH ที่ใช้ได้อย่างไร

คำตอบ:


17

ฉันไม่รู้จักสวิตช์บรรทัดคำสั่งที่ใช้งานง่าย แต่ในopenssl s_clientบรรทัดคำสั่งคุณสามารถเพิ่ม-msgตัวเลือกเพื่อรับดัมพ์เลขฐานสิบหกของข้อความการจับมือกัน จากนั้นมองหา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: ข้อความประเภท "ServerKeyExchange" (นั่นคือ "0c") ของความยาว 0x00030B ไบต์
  • องค์ประกอบแรกคือ DH โมดูลัสเป็นจำนวนเต็มขนาดใหญ่ที่มีส่วนหัวความยาวสองไบต์ ที่นี่ความยาวถูกเข้ารหัสเป็น01 00หมายถึงจำนวนเต็มที่เข้ารหัสมากกว่า 0x0100 ไบต์ นั่นคือ 256 ไบต์ดังนั้นโมดูลัสจึงมีความยาวระหว่าง 2041 และ 2048 บิต
  • ไบต์โมดูลัสจะตามมาในลำดับ big-endian ที่ไม่ได้ลงชื่อ ไบต์สูงสุดของโมดูลัสนั้นในกรณีff ff ff ff...นี้ โมดูลัสนั้นมีความยาวถึง 2048 บิต

หากคุณใช้ชุดรหัส ECDHE (เส้นโค้งวงรี) ServerKeyExchangeรูปแบบนั้นแตกต่างกันแน่นอน

ดูมาตรฐานสำหรับคำจำกัดความของServerKeyExchangeข้อความ สำหรับชุดรหัส DHE ประกอบด้วยโมดูลัสp , ตัวสร้างgและรหัสสาธารณะ DH ของเซิร์ฟเวอร์yตามลำดับแต่ละรายการจะแสดงเป็นจำนวนเต็มขนาดใหญ่ในรูปแบบที่อธิบายข้างต้น (ส่วนหัว 16 บิตที่ประกอบด้วยความยาวเป็นไบต์และจำนวนเต็ม ค่าในการเข้ารหัส big-endian ที่ไม่ได้ลงชื่อ)

OpenSSL เวอร์ชันล่าสุดมีแนวโน้มที่จะเลือกขนาด DH โมดูลัสที่แมตช์ (จากจุดรักษาความปลอดภัยของมุมมอง) ความแข็งแรงของคู่คีย์ของเซิร์ฟเวอร์ (ใช้ในการเข้าสู่ระบบServerKeyExchangeข้อความ) ในตัวอย่างข้างต้นเซิร์ฟเวอร์มีคีย์ RSA 2048 บิตดังนั้น OpenSSL จึงเลือกใช้ DH modulus 2048 บิต (ในกรณีนี้ modulus ที่รู้จักกันดีที่อธิบายไว้ในRFC 3526, ส่วนที่ 3 )

บางเซิร์ฟเวอร์อื่น ๆ ติดกลุ่ม DH 1024 บิตในการสั่งซื้อเพื่อให้เข้ากันกับลูกค้าที่มีอยู่บางส่วนที่ไม่สนับสนุนกลุ่มเอชที่มีขนาดใหญ่ (ที่ใหญ่ที่สุดผู้กระทำความผิดเป็นการใช้งาน SSL ใน Java คงที่ในชวา 8 สร้าง 56ในปี 2012) ข้อบกพร่องที่ทราบในโปรโตคอล TLS สำหรับชุดเข้ารหัส DHE คือไคลเอ็นต์ไม่มีวิธีระบุขนาดของมอดุลัสที่อาจรองรับ (นี่คือการแก้ไขสำหรับ ECDHE เนื่องจากไคลเอ็นต์สามารถระบุรายการเส้นโค้งที่แน่นอนที่ยอมรับได้) .


1
OpenSSLไม่ได้เลือก DHE โดยอัตโนมัติ แต่การเรียกกลับของแอปสามารถทำได้ OpenSSL 1.0.2 (มกราคม 2015) สามารถเลือก ECDHE โดยอัตโนมัติและใน 1.0.2 s_clientจะแสดง "คีย์เซิร์ฟเวอร์ชั่วคราว" DH & ขนาดหรือ ECDH & เส้นโค้งเมื่อใช้งานก่อน "จับมืออ่าน x และเขียน y" ดังนั้นคุณไม่จำเป็นต้องใช้อีกต่อไป เพื่อถอดรหัส มันเป็นApache mod_sslล่าสุดที่เลือก DHE โดยอัตโนมัติ: httpd.apache.org/docs/trunk/mod/mod_ssl.html#sslcertificatefile (ซึ่งบันทึกปัญหาเกี่ยวกับไคลเอนต์ Java)
dave_thompson_085

ผมใช้ 1.0.1e OpenSSL และฉันไม่ได้รับการใด ๆกับServerKeyExchange 0c 00 03 0bคุณสามารถให้คำสั่งที่แน่นอนเพื่อรับผลลัพธ์หรือไม่ ฉันไม่มี Handshakes ที่เริ่มต้นด้วย0c
rubo77

หากชุดรหัสที่เลือกโดยเซิร์ฟเวอร์ไม่ใช่ชุดรหัส "DHE" หรือ "ECHDE" จะไม่มีข้อความ ServerKeyExchange
โทมัส Pornin

ฉันได้รับ <<< TLS 1.2 Handshake [length 01cd], ServerKeyExchange 0c 00 01 c9 03 00 17 41 04 08 5f 82 88 1e e5 b6 ตามด้วย 443 octets ซึ่งสอดคล้องกับความยาว 0x1c9 เริ่มที่แปด octet อย่างไรก็ตาม "0300" ดูเหมือนจะหมายถึง 768 octets ในขณะที่ฉันรู้สึกว่า DH param ของฉันคือ "เพียง" 2048 บิต
Law29

1
@ Law29 สิ่งนี้ดูเหมือนเป็น ECDHE ServerKeyExchange หากใช้เส้นโค้งรูปไข่แล้ว "03" หมายถึง "นี่คือเส้นโค้งที่มีชื่อสองไบต์ถัดไปเข้ารหัสตัวระบุเส้นโค้ง" จากนั้น "00 17" คือตัวระบุส่วนโค้งซึ่งเป็น NIST P-256 (ส่วนโค้งที่ใช้มากที่สุดสำหรับ ECDHE) จากนั้น "41" คือความยาวจุดสาธารณะซึ่งเป็นค่าที่ถูกต้องสำหรับจุด P-256 ในรูปแบบที่ไม่มีการบีบอัด จุดดังกล่าวจะเริ่มต้นด้วยไบต์ของค่า 0x04 และนั่นคือสิ่งที่คุณมี ในการสรุป: ดูเหมือนว่าการจับมือ TLS 1.2 ของคุณใช้ ECDHE จริง ๆ ไม่ใช่ DHE
โทมัส

9

หากคุณมีใบรับรองในรูปแบบ PEM คุณสามารถลองใช้คำสั่งนี้ได้ควรให้ผลลัพธ์ที่เหมาะสมจากคำสั่ง Openssl

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

(ตัวอย่างผลลัพธ์)
    พารามิเตอร์ PKCS # 3 DH: (512 บิต)
        นายก:
            xx: xx: xx: xx
            xx: xx: xx: xx
            xx: xx: xx: xx
        เครื่องกำเนิดไฟฟ้า: 2 (0x2)
พารามิเตอร์ DH ดูเหมือนจะโอเค
----- BEGIN DH พารามิเตอร์
XXXX
XXXX
----- END พารามิเตอร์ DH -----

หวังว่านี่คือสิ่งที่คุณกำลังมองหา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.