Bir sunucunun HTTPS için SNI kullanıp kullanmadığını nasıl anlayabilirim?


41

Bir sunucunun, bir web sitesindeki HTTPS sertifikası için Sunucu Adı Göstergesi SSL uzantısını kullanıp kullanmadığını bilmek için basit bir yol arıyorum. Bir tarayıcı veya Unix komut satırı kullanan bir yöntem iyidir.

Teşekkürler!

Yanıtlar:


20

SNI müşteri tarafından başlatılır, bu nedenle onu destekleyen bir müşteriye ihtiyacınız vardır. Windows XP’de değilseniz, tarayıcınız Müşteriniz SSL bağlantılarını doğru şekilde hata ayıklamanıza izin veriyorsa (ne yazık ki, gnutls / openssl CLI komutları bile yapmaz), sunucunun genişletilmiş merhabada bir server_name alanı gönderip göndermeyeceğini görebilirsiniz. Unutmayın, bu alanın olmaması, sunucunun bir sertifika almaya yardımcı olmak için istemcideki sunucu_adı'nı kullanmadığı, onu desteklemediği anlamına gelir.

Bu yüzden pratikte en kolay test bağlantı kurmayı denemektir. Bunun için, bir ssl bağlantısının yapılabileceği aynı IP'ye çözümlenen iki isim bilmeniz gerekir. https, her iki isme de göz atabileceğiniz ve doğru sertifikayla sunulmuş olup olmadığınızı görebildiğiniz için en kolay yoldur.

Üç sonuç vardır:

  • Her iki adı da kapsayan bir joker karakter sertifikası (veya bir konuAltName olan) alıyorsunuz: hiçbir şey öğrenmiyorsunuz
  • Bunlardan en az biri için yanlış sertifika alıyorsunuz: ya sunucu SNI'yi desteklemiyor ya da yanlış yapılandırılmış
  • Her ikisi de doğru ad için iki farklı sertifika alırsınız: SNI desteklenir ve doğru yapılandırılmıştır.

Daha fazla bilgi verecek olan biraz daha karmaşık bir test, tarama sırasında tellerin açık olması ve yakalanmasıdır. Daha sonra ilgili paketleri ssl.handshake için filtreleyerek bulabilirsiniz. Aşağıdaki ekran görüntüleri SNI'nin desteklendiği bir müşteri merhaba / sunucu merhaba çifti örneğidir:

Müşteri merhaba Sunucu merhaba

Yine, tabii ki sunucuda bir server_name alanının olmaması Merhaba, SNI'nin desteklenmediğini göstermez. Yalnızca istemci tarafından sağlanan sunucu_adı, hangi sertifikanın kullanılacağına karar vermede kullanılmadı.


9
Dennis - katılmıyorum openssl. Bazı detaylar mevcuttur: openssl s_client -servername alice.sni.velox.ch -tlsextdebug -msg -connect alice.sni.velox.ch:443Qualys SSL testi sırasında SNI kullanmanın bir göstergesi verilmiştir .
Deer Hunter

Ah, manpage de onu özledim. Ekleme için teşekkürler.
Dennis Kaarsemaker

26

Bir SSL / TLS Sunucu Adı Belirtme uzantısı başlığının varlığını tespit etmek için muhtemelen aradığınız liner:

openssl s_client -servername www.SERVERNAME.com -tlsextdebug -connect www.YOURSERVER.com:443 2>/dev/null | grep "server name"

www.SERVERNAME.comtest ettiğiniz SNI değeri nerede ve test www.YOURSERVER.comettiğiniz TLS özellikli sunucunun alan adı veya IP adresi.

Komut satırı kullanımları openssl'in s_client(bakınız s_client (1) ) sunucuya bağlanmak için www.YOURSERVER.combağlantı noktası 443. Bu -tlsextdebugseçenek, TLS uzantılı hata ayıklama çıkışını açar. -servernameSeçenek anlatır s_clientgeçmek programı www.SERVERNAME.comTLS el sıkışması sırasında ClientHello pakette SNI alanın değeri olarak.

Son olarak, 2>/dev/nullsadece stderr çıkışını gizler (bu gürültülü olabilir) ve | grep "server name"boru hattı stdout'u, s_clientTLS uzantısı hata ayıklama çıktısında "sunucu adı" olarak adlandırılan TLS uzantısını görüntülemek için filtreler .

Gibi bir çıkış hattı görürseniz

TLS server extension "server name" (id=0), len=0

daha sonra sunucu SNI başlık bilgisini ServerHello yanıtında döndürüyor. Bunu yapmazsanız, sunucu ya SNI'yi desteklemiyor olabilir ya da istediğiniz isim verilen SNI bilgisini döndürecek şekilde yapılandırılmamış olabilir. Bu durumda, -servernamesunucunun SNI bilgisiyle yanıt vermesi gereken seçenekde bir etki alanı adı kullandığınızı kontrol edin .


1
Doğru -servernameya da kullanmasam da çıktı aynı . -servername sdfsdlkfjsdf23.somedomain.somewhere -connect realhost.somedomain.somewhere= TLS server extension "server name" (id=0), len=0(Eşleşirlerse aynı çıktı.) Sunucudaki bir ana makinenin çıktıdan eşleşmediğini nasıl doğrularsınız?
bshea

1
@bshea Yukarıdaki paragraflara -msgek olarak geçmeniz ve "Alert" için greplemeniz gerekir . Eğer -servernameyanlışsa TLS 1.2 Alert ... warning unrecognized_name, sunucudan bir şey alacaksınız . @Meitar Cevabı eklerseniz diğer insanlar için faydalı olacağını düşünüyorum.
Viktor Nonov

@ViktorNonov -msgAnahtar, sadece TLS protokolü mesajlarının hexdump'ını ekler. Bir TLS el sıkışma hatasını gözlemlemek gerekmez, bu nedenle bu cevaba eklemek yanlış olur. Dahası, bunun gibi TLS anlaşması hataları STDOUT'a basılmıştır; bu , ilk etapta 2>/dev/nullişlenmesi için cevabın cevaptan kaldırılması gerektiği anlamına gelir grep. Aslında sormak istediğim bshea, "TLS hatalarını nasıl tespit edebilirim?" "Bu sunucu TLS protokolünün SNI özelliğini kullanıyor mu?" sorusuna tamamen farklı bir sorudur. Burada konu nedir.
Meitar

@Meitar, TLS anlaşması mesajlarını gözlemlemenin başka bir yolunu bulamadım. Ayrıca STDERR, bir metin dosyasına yönlendirmek bile olsa , o hatayı alamıyorum. Olmadan -msgdiğer seçenek olduğunu gösterir tokalaşma mesajları bulamadık. (openssl 1.0.2q kullanılarak). Cevabın uygunluğu sürece haklı olabilirsin.
Viktor Nonov

-2

opensslSertifika almak ve sorgulamak için kullanabilirsiniz .

  • ile cert almak openssl s_client -connect
  • cert ile ayrıştırmak openssl x509
  • grep "DNS:" bilgisini bulmak için

openssl s_client -connect alice.sni.velox.ch:443 | openssl x509 -noout -text | grep DNS:

% openssl s_client -connect alice.sni.velox.ch:443 | openssl x509 -noout -text | grep DNS:
depth=2 C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 2
verify return:1
depth=1 C = BM, O = QuoVadis Limited, CN = QuoVadis Global SSL ICA G2
verify return:1
depth=0 C = CH, ST = Zuerich, L = Zuerich, O = Kaspar Brand, CN = alice.sni.velox.ch
verify return:1
                DNS:alice.sni.velox.ch, DNS:carol.sni.velox.ch

Son satır, sertifikada bulunan tüm SNI girişlerini gösterir:

                DNS:alice.sni.velox.ch, DNS:carol.sni.velox.ch

Bu çıktıda ne arıyorum? Çoklu alanların mevcut olduğu gerçeği?
spookylukey

DNS:... Son satırında girişler tüm sertifikada geçerli SNI adlarını gösterir.
spazm '

4
Bir sertifikadaki SAN'lar ve bir sunucudaki SNI desteği farklı şeylerdir, SAN'ların HTTPS sanal ana bilgisayarları için kullanımı SNI'yi yücelten bir şeydir. SNI için, SAN'larla bir sertifikaya ihtiyacınız yoktur, çünkü sunucu, beklentileri adlandıran istemcilere uygun ayrı bir sertifika seçebilir.
mr.spuratic
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.