Nhận chứng chỉ SSL / TLS của máy chủ bằng cách sử dụng opens openssl s_client '


17

Tôi đang cố lấy chứng chỉ SSL / TLS cho một trong những bộ cân bằng tải của chúng tôi (Netscaler) bằng cách sử dụng:

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

Nhưng nó sẽ không cho tôi xem chứng chỉ:

CONNECTED(00000003)
write:errno=54

Việc sử dụng -servername lb.example.comkhông giúp ích gì, và sysadmin của chúng tôi đã nói với tôi rằng bộ cân bằng tải của chúng tôi không sử dụng SNI.

Chỉnh sửa : Máy chủ nằm trong mạng nội bộ của chúng tôi và không chấp nhận kết nối từ internet công cộng. Đây là đầu ra của openssl với -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

Và đây là đầu ra có liên quan từ 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: */*
>

Bất kỳ đề xuất nào về cách tôi có thể có được chứng chỉ bằng cách sử dụng openssl s_client?


2
Bạn đang làm điều đó một cách thích hợp. Nhưng dựa trên thông tin hiện tại, không thể nói điều gì sai: có thể là tường lửa chặn bắt tay TLS, có thể là sự cố giao thức TLS .... Nó có thể hữu ích nếu bạn cung cấp URL (công khai) mà bạn đang cố sử dụng làm mục tiêu hoặc thêm đầu ra gỡ lỗi đầy đủ (tùy chọn -debug) vào câu hỏi của bạn.
Steffen Ullrich

Như @SteffenUllrich nói đó có thể là TLS. Xem openssl cùng một lỗi - giải pháp có thể ở đây .
Zina

Câu trả lời:


21

Sau một thời gian tôi đã hiểu ra: bộ cân bằng tải cụ thể này được cấu hình để chỉ sử dụng TLSv1.2, phiên bản openssl có trong OS X (0.9.8) không hiểu. Tôi đã cài đặt phiên bản mới hơn của openssl (> = 1.0.1) bằng cách sử dụng homebrew để nó hoạt động:

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

3

Tôi đang cố lấy chứng chỉ SSL / TLS cho một trong những bộ cân bằng tải của chúng tôi (Netscaler) bằng cách sử dụng:

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

Nếu đó là một cấu hình hiện đại (một số từ bỏ ý nghĩa của điều đó), hãy sử dụng:

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

Dường như có thêm một phần mở đầu ở byte 0 và 1. Ở byte 2, cần có một loại bản ghi. Ở byte 3 và 4 nên có số phiên bản. Byte 5 và 6 phải là độ dài 16 bit của tải trọng.

Đây là một ví dụ hoạt động:

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

Từ trên, loại bản ghi ở vị trí 0 và giá trị của nó là 0x16. 0x16 là loại Bắt tay. Phiên bản lớp bản ghi là hai byte tiếp theo ở vị trí 2 và 3. Giá trị của chúng là 0x03 0x01. Độ dài của tải trọng là 0x007f.

Đồng thời xem RFC 5246, Giao thức bảo mật lớp vận chuyển (TLS) Phiên bản 1.2 , trang 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;

Vấn đề của bạn có thể là loại bản ghi tương thích SSLv2 cũ. Hoặc nó có thể là phiên bản cấp thấp của OpenSSL từ, giả sử 0.9.5 hoặc 0.9.8. Thật khó để nói, và có lẽ chúng ta cần thêm thông tin.

Thông tin thêm sẽ bao gồm HĐH; Phiên bản OpenSSL; nếu bạn đã cố thay thế phiên bản OpenSSL của nền tảng bằng phiên bản OpenSSL của riêng bạn; nếu có tường lửa hoặc hộp "kiểm tra web" hoặc tính tốt của phần mềm trung gian khác đang chạy; và những gì máy chủ nhận được.


Việc sử dụng -servername lb.example.comkhông giúp ích gì, và sysadmin của chúng tôi đã nói với tôi rằng bộ cân bằng tải của chúng tôi không sử dụng SNI.

Điều này nghe có vẻ bất thường. Nhưng nó là một phần mở rộng cho TLS, vì vậy nó bị bỏ qua nếu không được sử dụng (và sẽ không tạo ra một cảnh báo nghiêm trọng).

Nguyên tắc chung trong năm 2016: luôn sử dụng TLS 1.0 trở lên và luôn sử dụng SNI.

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.