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!
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!
Jawaban:
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:
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:
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.
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.com
nilai SNI yang Anda uji dan www.YOURSERVER.com
merupakan 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.com
port 443
. The -tlsextdebug
bergantian pilihan pada ekstensi TLS debugging output. The -servername
pilihan menceritakan s_client
program untuk lulus www.SERVERNAME.com
sebagai nilai field SNI dalam paket ClientHello selama jabat tangan TLS.
Akhirnya, 2>/dev/null
cukup sembunyikan output stderr (yang bisa berisik), dan | grep "server name"
pipa filter stdout untuk menampilkan ekstensi TLS yang disebut "nama server" di s_client
output 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 -servername
opsi yang seharusnya ditanggapi oleh server dengan informasi SNI.
-servername
atau 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?
-msg
tambahan pada parameter di atas dan menerima "Peringatan". Jika -servername
salah, Anda akan mendapatkan sesuatu seperti TLS 1.2 Alert ... warning unrecognized_name
dari server. @ Meitar Saya pikir jika Anda menambahkannya ke jawaban akan bermanfaat bagi orang lain.
-msg
Switch 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/null
perlu dihapus dari jawaban agar dapat diproses grep
terlebih 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.
STDERR
ke file teks, saya tidak mendapatkan kesalahan itu di sana. Tanpa -msg
saya tidak dapat menemukan opsi lain yang menunjukkan pesan jabat tangan. (menggunakan openssl 1.0.2q). Selama relevansi dengan jawaban Anda mungkin benar.
Anda dapat menggunakan openssl
untuk mengambil dan menanyakan sertifikat.
openssl s_client -connect
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
DNS:...
entri pada baris terakhir menunjukkan semua nama SNI berlaku dalam sertifikat.
openssl
. Beberapa perincian tersedia:openssl s_client -servername alice.sni.velox.ch -tlsextdebug -msg -connect alice.sni.velox.ch:443
Beberapa indikasi penggunaan SNI diberikan selama uji Qualys SSL .