Dapatkan sertifikat SSL / TLS server menggunakan "openssl s_client"

17

Saya mencoba untuk mendapatkan sertifikat SSL / TLS untuk salah satu penyeimbang beban kami (Netscaler) menggunakan:

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

Tapi itu tidak akan menunjukkan kepada saya sertifikat:

CONNECTED(00000003)
write:errno=54

Penggunaan -servername lb.example.comtidak membantu, dan sysadmin kami memberi tahu saya bahwa penyeimbang beban kami tidak menggunakan SNI.

Sunting : Server ada di intranet kami dan tidak menerima koneksi dari internet publik. Ini adalah output dari openssl dengan -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

Dan ini adalah output yang relevan dari 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: */*
>

Adakah saran tentang bagaimana saya dapat memperoleh sertifikat menggunakan openssl s_client?

Daniel Serodio
sumber
2
Anda melakukannya dengan cara yang tepat. Tetapi berdasarkan informasi saat ini tidak mungkin untuk mengatakan apa yang salah: mungkin firewall memblokir jabat tangan TLS, mungkin menjadi masalah protokol TLS .... Mungkin membantu jika Anda memberikan URL (publik) yang Anda coba gunakan sebagai target atau menambahkan hasil debug penuh (opsi -debug) ke pertanyaan Anda.
Steffen Ullrich
Seperti yang dikatakan @SteffenUllrich, itu mungkin TLS. Lihat openssl error yang sama - kemungkinan solusi di sini .
Zina

Jawaban:

21

Setelah beberapa saat saya menemukan jawabannya: load balancer ini dikonfigurasikan untuk hanya menggunakan TLSv1.2, yang versi openssl yang termasuk dalam OS X (0.9.8) tidak mengerti. Saya menginstal versi openssl yang lebih baru (> = 1.0.1) menggunakan homebrew sehingga ini berfungsi:

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

Saya mencoba untuk mendapatkan sertifikat SSL / TLS untuk salah satu penyeimbang beban kami (Netscaler) menggunakan:

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

Jika ini merupakan konfigurasi modern (beberapa tangan mengabaikan apa artinya), gunakan:

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

Sepertinya ada beberapa mukadimah tambahan pada byte 0 dan 1. Pada byte 2, harus ada tipe catatan. Pada byte 3 dan 4 harus ada nomor versi. Bytes 5 dan 6 harus berukuran 16-bit dari payload.

Berikut ini contoh kerjanya:

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

Dari atas, tipe catatan berada di posisi 0, dan nilainya 0x16. 0x16 adalah jenis jabat tangan. Versi record layer adalah dua byte berikutnya pada posisi 2 dan 3. Nilainya adalah 0x03 0x01. Panjang payload adalah 0x007f.

Juga lihat RFC 5246, Protokol Transport Layer Security (TLS) Versi 1.2 , halaman 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;

Masalah Anda bisa menjadi tipe catatan yang kompatibel dengan SSLv2. Atau bisa juga versi OpenSSL dari bawah, katakan 0.9.5 atau 0.9.8. Sulit dikatakan, dan kita mungkin memerlukan lebih banyak informasi.

Informasi lebih lanjut akan mencakup OS; Versi OpenSSL; jika Anda mencoba mengganti versi platform OpenSSL dengan versi OpenSSL Anda sendiri; jika ada kotak firewall atau "web inspect" atau barang middleware lain yang sedang berjalan; dan apa yang diterima server.


Penggunaan -servername lb.example.comtidak membantu, dan sysadmin kami memberi tahu saya bahwa penyeimbang beban kami tidak menggunakan SNI.

Ini terdengar agak tidak biasa. Tetapi ini merupakan ekstensi untuk TLS, jadi diabaikan jika tidak digunakan (dan tidak akan menghasilkan peringatan fatal).

Aturan praktis di 2016: selalu menggunakan TLS 1.0 atau lebih tinggi, dan selalu menggunakan SNI.

jww
sumber