รับใบรับรอง SSL / TLS ของเซิร์ฟเวอร์โดยใช้“ openssl s_client”


17

ฉันกำลังพยายามรับใบรับรอง SSL / TLS สำหรับหนึ่งใน load balancer (Netscaler) ของเราโดยใช้:

openssl s_client -showcerts -connect lb.example.com:443

แต่จะไม่แสดงใบรับรองให้ฉัน:

CONNECTED(00000003)
write:errno=54

การใช้-servername lb.example.comไม่ได้ช่วยอะไรและดูแลระบบของเราบอกฉันว่า load balancer ของเราไม่ใช้ SNI

แก้ไข : เซิร์ฟเวอร์อยู่บนอินทราเน็ตของเราและไม่ยอมรับการเชื่อมต่อจากอินเทอร์เน็ตสาธารณะ นี่คือผลลัพธ์ของ openssl ด้วย-debug:

CONNECTED(00000003)
write to 0x7fec7af0abf0 [0x7fec7b803a00] (130 bytes => 130 (0x82))
0000 - 80 80 01 03 01 00 57 00-00 00 20 00 00 39 00 00   ......W... ..9..
0010 - 38 00 00 35 00 00 16 00-00 13 00 00 0a 07 00 c0   8..5............
0020 - 00 00 33 00 00 32 00 00-2f 00 00 9a 00 00 99 00   ..3..2../.......
0030 - 00 96 03 00 80 00 00 05-00 00 04 01 00 80 00 00   ................
0040 - 15 00 00 12 00 00 09 06-00 40 00 00 14 00 00 11   .........@......
0050 - 00 00 08 00 00 06 04 00-80 00 00 03 02 00 80 00   ................
0060 - 00 ff a6 f7 27 1a a7 18-85 cf b2 03 22 fc 48 3d   ....'.......".H=
0070 - dd a9 2c b7 76 67 62 80-df 85 ed 48 35 c7 d4 87   ..,.vgb....H5...
0080 - 8d d3                                             ..
read from 0x7fec7af0abf0 [0x7fec7b809000] (7 bytes => -1 (0xFFFFFFFFFFFFFFFF))
write:errno=54

และนี่คือผลลัพธ์ที่เกี่ยวข้องจากcurl -v https://lb.example.com/:

$ curl -vI https://lb.exmple.com/
*   Trying 1.2.3.4...
* Connected to lb.exmple.com (10.1.2.3) port 443 (#0)
* TLS 1.2 connection using TLS_RSA_WITH_AES_256_CBC_SHA
* Server certificate: lb.example.com
* Server certificate: RapidSSL SHA256 CA - G2
* Server certificate: GeoTrust Primary Certification Authority - G3
> HEAD / HTTP/1.1
> Host: lb.exmple.com
> User-Agent: curl/7.43.0
> Accept: */*
>

ข้อเสนอแนะใด ๆ เกี่ยวกับวิธีการขอรับใบรับรองโดยใช้openssl s_client?


2
คุณกำลังทำอย่างถูกวิธี แต่จากข้อมูลปัจจุบันมันเป็นไปไม่ได้ที่จะบอกว่ามีอะไรผิดพลาด: อาจเป็นไฟร์วอลล์ที่ปิดกั้นการจับมือกันของ TLS อาจเป็นปัญหาโปรโตคอล TLS ... อาจช่วยได้หากคุณระบุ URL (สาธารณะ) ที่คุณพยายามใช้เป็นเป้าหมายหรือเพิ่มเอาต์พุตการดีบักแบบเต็ม (ตัวเลือก-debug) ให้กับคำถามของคุณ
Steffen Ullrich

อย่างที่ @SteffenUllrich บอกว่ามันอาจเป็น TLS ดูOpenSSL ข้อผิดพลาดเดียวกัน - วิธีการแก้ปัญหาที่เป็นไปได้ที่นี่
Zina

คำตอบ:


21

หลังจากที่ในขณะที่ฉันคิดออก: load balancer นี้ถูกกำหนดค่าให้ใช้ TLSv1.2 เท่านั้นซึ่งเวอร์ชัน openssl ที่รวมอยู่ใน OS X (0.9.8) ไม่เข้าใจ ฉันติดตั้ง openssl รุ่นใหม่กว่า (> = 1.0.1) โดยใช้ homebrew ดังนั้นจึงใช้งานได้:

/usr/local/opt/openssl/bin/openssl s_client -showcerts -connect lb.example.com:443

3

ฉันกำลังพยายามรับใบรับรอง SSL / TLS สำหรับหนึ่งใน load balancer (Netscaler) ของเราโดยใช้:

 openssl s_client -showcerts -connect lb.example.com:443

หากมีการกำหนดค่าที่ทันสมัย ​​(บางมือสละสิ่งที่หมายถึง) ใช้:

openssl s_client -connect lb.example.com:443 -tls1 -servername lb.example.com | \
openssl x509 -text -noout

CONNECTED(00000003)
write to 0x7fec7af0abf0 [0x7fec7b803a00] (130 bytes => 130 (0x82))
0000 - 80 80 01 03 01 00 57 00-00 00 20 00 00 39 00 00
...

ดูเหมือนว่ามีคำนำพิเศษเพิ่มเติมที่ไบต์ 0 และ 1 ที่ไบต์ 2 ควรมีประเภทระเบียน ที่ไบต์ 3 และ 4 ควรมีหมายเลขเวอร์ชัน ไบต์ที่ 5 และ 6 ควรมีความยาว 16 บิตของส่วนของข้อมูล

นี่คือตัวอย่างการทำงาน:

$ openssl s_client -connect www.googl.com:443 -tls1 -servername www.googl.com -debug
CONNECTED(00000005)
write to 0x7f7fe1c1fa30 [0x7f7fe2022000] (132 bytes => 132 (0x84))
0000 - 16 03 01 00 7f 01 00 00-7b 03 01 71 c0 12 35 98
...

จากด้านบนประเภทระเบียนอยู่ที่ตำแหน่ง 0 และค่าของมันคือ 0x16 0x16 เป็นประเภท Handshake รุ่นบันทึกชั้นเป็นสองไบต์ต่อไปที่ตำแหน่งที่ 2 และ 3 0x03 0x01มีค่าของพวกเขา 0x007fความยาวของส่วนของข้อมูลคือ

ดูที่RFC 5246, โปรโตคอล Transport Layer Security (TLS) เวอร์ชัน 1.2 , หน้า 18:

6.2.1.  Fragmentation

   The record layer fragments information blocks into TLSPlaintext
   records carrying data in chunks of 2^14 bytes or less.  Client
   message boundaries are not preserved in the record layer (i.e.,
   multiple client messages of the same ContentType MAY be coalesced
   into a single TLSPlaintext record, or a single message MAY be
   fragmented across several records).

      struct {
          uint8 major;
          uint8 minor;
      } ProtocolVersion;

      enum {
          change_cipher_spec(20), alert(21), handshake(22),
          application_data(23), (255)
      } ContentType;

      struct {
          ContentType type;
          ProtocolVersion version;
          uint16 length;
          opaque fragment[TLSPlaintext.length];
      } TLSPlaintext;

ปัญหาของคุณอาจเป็นประเภทระเบียนที่รองรับ SSLv2 แบบเก่า หรืออาจเป็นรุ่นระดับล่างของ OpenSSL จากพูด 0.9.5 หรือ 0.9.8 มันยากที่จะพูดและเราอาจต้องการข้อมูลเพิ่มเติม

ข้อมูลเพิ่มเติมจะรวมถึงระบบปฏิบัติการ รุ่น OpenSSL; หากคุณพยายามแทนที่ OpenSSL เวอร์ชันของแพลตฟอร์มด้วย OpenSSL เวอร์ชันของคุณเอง หากมีไฟร์วอลล์หรือกล่อง "ตรวจสอบเว็บ" หรือการใช้งานมิดเดิลแวร์อื่น ๆ และสิ่งที่เซิร์ฟเวอร์ได้รับ


การใช้-servername lb.example.comไม่ได้ช่วยอะไรและดูแลระบบของเราบอกฉันว่า load balancer ของเราไม่ใช้ SNI

ฟังดูแปลก ๆ แต่มันเป็นส่วนขยายของ TLS ดังนั้นจึงไม่สนใจหากไม่ได้ใช้ (และจะไม่สร้างการแจ้งเตือนที่ร้ายแรง)

กฎแห่งหัวแม่มือในปี 2559: ใช้ TLS 1.0 ขึ้นไปเสมอและใช้ SNI เสมอ

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