“Openssl s_client” kullanarak sunucunun SSL / TLS sertifikasını alın


17

Yük dengeleyicilerimizden (Netscaler) birini kullanarak SSL / TLS sertifikasını almaya çalışıyorum:

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

Ama bana sertifikayı göstermeyecek:

CONNECTED(00000003)
write:errno=54

Kullanmak -servername lb.example.comyardımcı olmaz ve sistem yöneticimiz bana yük dengeleyicilerimizin SNI kullanmadığını söyledi.

Düzenleme : Sunucu intranetimizde ve genel internet bağlantılarını kabul etmiyor. Bu, openssl'nin çıktısıdır -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

Ve bu ilgili çıktı 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: */*
>

Sertifikayı kullanarak nasıl edinebileceğim konusunda herhangi bir öneriniz var openssl s_clientmı?


2
Doğru şekilde yapıyorsun. Ancak mevcut bilgilere dayanarak, neyin yanlış gittiğini söylemek mümkün değildir: TLS anlaşmasını engelleyen bir güvenlik duvarı olabilir, bir TLS protokol sorunu olabilir .... Hedef olarak kullanmaya çalıştığınız (herkese açık) URL'yi sağlamanız veya -debugsorunuza tam hata ayıklama çıktısını (seçenek ) eklemeniz yardımcı olabilir .
Steffen Ullrich

@SteffenUllrich'in dediği gibi TLS olabilir. Aynı hatanın olası çözümüne bakın - olası çözüm burada .
Zina

Yanıtlar:


21

Bir süre sonra anladım: bu özel yük dengeleyici yalnızca OS X (0.9.8) 'de bulunan openssl sürümünün anlamadığı TLSv1.2'yi kullanacak şekilde yapılandırıldı. Ben homebrew kullanarak openssl (> = 1.0.1) yeni bir sürümünü yükledim, böylece bu çalışır:

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

3

Yük dengeleyicilerimizden (Netscaler) birini kullanarak SSL / TLS sertifikasını almaya çalışıyorum:

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

Modern bir konfigürasyon (bazı el bunun ne anlama geldiğinden feragat) ise, kullanın:

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

Bayt 0 ve 1'de fazladan bir önsöz var gibi görünüyor. Bayt 2'de bir kayıt türü olmalıdır. Bayt 3 ve 4'te bir sürüm numarası olmalıdır. Bayt 5 ve 6, yükün 16 bit uzunluğunda olmalıdır.

İşte çalışan bir örnek:

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

Yukarıdan, kayıt türü 0 konumundadır ve değeri 0x16'dır. 0x16, El Sıkışma türüdür. Kayıt katmanı sürümü, 2 ve 3 konumlarındaki sonraki iki bayttır 0x03 0x01. Yükün uzunluğu 0x007f.

Ayrıca bkz. RFC 5246, Aktarım Katmanı Güvenliği (TLS) Protokolü Sürüm 1.2 , sayfa 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;

Sorununuz eski SSLv2 uyumlu kayıt türü olabilir. Veya OpenSSL'nin aşağı düzey bir sürümü olabilir, örneğin 0.9.5 veya 0.9.8. Söylemesi zor ve muhtemelen daha fazla bilgiye ihtiyacımız var.

Daha fazla bilgi OS; OpenSSL sürümü; platformun OpenSSL sürümünü kendi OpenSSL sürümünüzle değiştirmeyi denediyseniz; çalışan bir güvenlik duvarı veya "web incelemesi" kutusu veya başka bir ara katman yazılımı iyiliği varsa; ve sunucunun aldığı.


Kullanmak -servername lb.example.comyardımcı olmaz ve sistem yöneticimiz bana yük dengeleyicilerimizin SNI kullanmadığını söyledi.

Bu sıra dışı geliyor. Ancak TLS'nin bir uzantısı, bu yüzden kullanılmazsa (ve ölümcül bir uyarı üretmezse) göz ardı edilir.

2016'da temel kural: her zaman TLS 1.0 veya üstü kullanın ve daima SNI kullanın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.