Bagaimana saya bisa mendeteksi jika server menggunakan SNI untuk HTTPS?

41

Saya mencari cara sederhana untuk mengetahui apakah server menggunakan ekstensi SSL Indikasi Nama Server untuk sertifikat HTTPS di situs web. Metode yang menggunakan peramban atau baris perintah Unix baik-baik saja.

Terima kasih!

spookylukey
sumber

Jawaban:

20

SNI dimulai oleh klien, jadi Anda membutuhkan klien yang mendukungnya. Kecuali Anda menggunakan windows XP, browser Anda akan melakukannya. Jika klien Anda memungkinkan Anda men-debug koneksi SSL dengan benar (sayangnya, bahkan perintah gnutls / openssl CLI tidak), Anda dapat melihat apakah server mengirim kembali bidang nama server dalam halo yang diperluas. Perhatikan bahwa tidak adanya bidang ini hanya berarti bahwa server tidak menggunakan nama_dalam server halo untuk membantu memilih sertifikat, bukan karena tidak mendukungnya.

Jadi, dalam praktiknya tes termudah adalah dengan hanya mencoba menghubungkan. Untuk ini, Anda perlu tahu dua nama yang memutuskan untuk IP yang sama, di mana koneksi ssl dapat dibuat. https paling mudah karena Anda kemudian dapat menelusuri kedua nama dan melihat apakah Anda disajikan dengan sertifikat yang benar.

Ada tiga hasil:

  • Anda mendapatkan sertifikat wildcard (atau yang dengan subjectAltName) yang mencakup kedua nama: Anda tidak belajar apa-apa
  • Anda mendapatkan sertifikat yang salah untuk setidaknya satu dari mereka: entah server tidak mendukung SNI atau telah salah dikonfigurasi
  • Anda mendapatkan dua sertifikat berbeda, baik untuk nama yang benar: SNI didukung dan dikonfigurasi dengan benar.

Tes yang sedikit lebih rumit yang akan menghasilkan lebih banyak info adalah untuk membuka dan menangkap wireshark saat menjelajah. Anda kemudian dapat menemukan paket yang relevan dengan memfilter untuk ssl.handshake. Screenshot di bawah ini adalah contoh dari pasangan halo klien / server halo di mana SNI didukung:

Halo klien Halo server

Sekali lagi, tentu saja tidak adanya bidang nama server di server halo tidak menunjukkan bahwa SNI tidak didukung. Hanya bahwa server_name yang disediakan klien tidak digunakan dalam memutuskan sertifikat yang akan digunakan.

Dennis Kaarsemaker
sumber
9
Dennis - tidak setuju pada openssl. Beberapa perincian tersedia: openssl s_client -servername alice.sni.velox.ch -tlsextdebug -msg -connect alice.sni.velox.ch:443Beberapa indikasi penggunaan SNI diberikan selama uji Qualys SSL .
Deer Hunter
Ah, saya melewatkan itu di halaman manual. Terima kasih untuk tambahannya.
Dennis Kaarsemaker
26

Satu liner yang mungkin Anda cari untuk mendeteksi keberadaan header ekstensi Indikasi Nama Server SSL / TLS adalah:

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

di mana www.SERVERNAME.comnilai SNI yang Anda uji dan www.YOURSERVER.commerupakan nama domain atau alamat IP dari server berkemampuan TLS yang Anda uji.

Baris perintah menggunakan openssl's s_client(lihat s_client (1) ) untuk terhubung ke server di www.YOURSERVER.comport 443. The -tlsextdebugbergantian pilihan pada ekstensi TLS debugging output. The -servernamepilihan menceritakan s_clientprogram untuk lulus www.SERVERNAME.comsebagai nilai field SNI dalam paket ClientHello selama jabat tangan TLS.

Akhirnya, 2>/dev/nullcukup sembunyikan output stderr (yang bisa berisik), dan | grep "server name"pipa filter stdout untuk menampilkan ekstensi TLS yang disebut "nama server" di s_clientoutput debugging ekstensi TLS.

Jika Anda melihat garis output seperti

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

kemudian server mengembalikan informasi header SNI dalam respons ServerHello-nya. Jika tidak, maka kemungkinan server tidak mendukung SNI atau belum dikonfigurasi untuk mengembalikan informasi SNI mengingat nama yang Anda minta. Dalam hal ini, periksa kembali apakah Anda menggunakan nama domain pada -servernameopsi yang seharusnya ditanggapi oleh server dengan informasi SNI.

Meitar
sumber
1
Outputnya sama apakah saya menggunakan yang benar -servernameatau tidak. -servername sdfsdlkfjsdf23.somedomain.somewhere -connect realhost.somedomain.somewhere= TLS server extension "server name" (id=0), len=0(Dan output yang sama jika mereka cocok.) Bagaimana Anda memverifikasi itu tidak cocok dengan host di server dari output?
bshea
1
@ bshea Anda harus memberikan -msgtambahan pada parameter di atas dan menerima "Peringatan". Jika -servernamesalah, Anda akan mendapatkan sesuatu seperti TLS 1.2 Alert ... warning unrecognized_namedari server. @ Meitar Saya pikir jika Anda menambahkannya ke jawaban akan bermanfaat bagi orang lain.
Viktor Nonov
@ ViktorNonov -msgSwitch hanya menambahkan hexdump pesan protokol TLS. Tidak perlu mengamati kesalahan jabat tangan TLS, jadi tidak benar untuk menambahkan jawaban ini. Selain itu, kesalahan jabat tangan TLS seperti ini dicetak ke STDOUT, yang berarti bahwa 2>/dev/nullperlu dihapus dari jawaban agar dapat diproses grepterlebih dahulu. Apa yang sebenarnya diminta oleh @bshea adalah "Bagaimana cara mendeteksi kesalahan TLS?" yang merupakan pertanyaan yang sepenuhnya berbeda dengan pertanyaan "Apakah server ini menggunakan fitur SNI dari protokol TLS?" yang merupakan topik di sini.
Meitar
@ Meitar, saya tidak bisa menemukan cara lain untuk mengamati pesan jabat tangan TLS. Bahkan jika saya mengarahkan kembali STDERRke file teks, saya tidak mendapatkan kesalahan itu di sana. Tanpa -msgsaya tidak dapat menemukan opsi lain yang menunjukkan pesan jabat tangan. (menggunakan openssl 1.0.2q). Selama relevansi dengan jawaban Anda mungkin benar.
Viktor Nonov
-2

Anda dapat menggunakan openssluntuk mengambil dan menanyakan sertifikat.

  • ambil sertifikat dengan openssl s_client -connect
  • parse sertifikat dengan openssl x509
  • grep untuk menemukan info "DNS:"

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

Baris terakhir menunjukkan semua entri SNI yang ada dalam sertifikat:

                DNS:alice.sni.velox.ch, DNS:carol.sni.velox.ch
spazm
sumber
Apa yang saya cari di output itu? Fakta bahwa banyak domain hadir?
spookylukey
The DNS:... entri pada baris terakhir menunjukkan semua nama SNI berlaku dalam sertifikat.
spazm
4
SAN dalam sertifikat dan dukungan SNI pada server adalah hal yang berbeda, penggunaan SAN untuk HTTPS virtualhosting adalah sesuatu peretasan yang mendahului SNI. Untuk SNI Anda tidak memerlukan sertifikat dengan SAN karena server dapat memilih sertifikat individual yang sesuai dengan harapan penamaan klien.
mr.spuratic