Câu trả lời:
SNI được khởi tạo bởi máy khách, vì vậy bạn cần một máy khách hỗ trợ nó. Trừ khi bạn ở trên Windows XP, trình duyệt của bạn sẽ làm. Nếu ứng dụng khách của bạn cho phép bạn gỡ lỗi các kết nối SSL đúng cách (đáng buồn là ngay cả các lệnh CLI gnutls / openssl không), bạn có thể xem liệu máy chủ có gửi lại trường server_name trong lời chào mở rộng không. Lưu ý rằng sự vắng mặt của trường này chỉ có nghĩa là máy chủ không sử dụng server_name trong ứng dụng khách xin chào để giúp chọn chứng chỉ, không phải là nó không hỗ trợ.
Vì vậy, trong thực tế thử nghiệm đơn giản nhất là chỉ cần thử kết nối. Đối với điều này, bạn cần biết hai tên phân giải cùng một IP, có thể tạo kết nối ssl. https là dễ nhất vì sau đó bạn có thể chỉ cần duyệt đến cả hai tên và xem nếu bạn được trình bày với chứng chỉ chính xác.
Có ba kết quả:
Một thử nghiệm phức tạp hơn một chút sẽ mang lại nhiều thông tin hơn là mở wireshark và chụp trong khi duyệt. Sau đó, bạn có thể tìm thấy các gói có liên quan bằng cách lọc cho ssl.handshake. Các ảnh chụp màn hình bên dưới là một ví dụ về cặp chào khách / máy chủ xin chào, nơi SNI được hỗ trợ:
Một lần nữa, tất nhiên sự vắng mặt của trường server_name trong máy chủ xin chào không cho thấy SNI không được hỗ trợ. Chỉ có điều là server_name do khách hàng cung cấp không được sử dụng để quyết định sử dụng chứng chỉ nào.
Lớp lót mà bạn có thể đang tìm kiếm để phát hiện sự hiện diện của tiêu đề mở rộng Chỉ định Tên Máy chủ SSL / TLS là:
openssl s_client -servername www.SERVERNAME.com -tlsextdebug -connect www.YOURSERVER.com:443 2>/dev/null | grep "server name"
nơi www.SERVERNAME.com
là giá trị SNI bạn đang thử nghiệm và www.YOURSERVER.com
là tên miền hoặc địa chỉ IP của máy chủ TLS có khả năng bạn thử nghiệm đang.
Dòng lệnh sử dụng openssl
's s_client
(xem s_client (1) ) để kết nối với máy chủ tại www.YOURSERVER.com
cổng 443
. Các -tlsextdebug
lượt tùy chọn trên phần mở rộng TLS gỡ lỗi đầu ra. Các -servername
tùy chọn kể s_client
chương trình để vượt qua www.SERVERNAME.com
như giá trị của lĩnh vực SNI trong gói ClientHello trong khi bắt tay TLS.
Cuối cùng, 2>/dev/null
chỉ cần ẩn đầu ra stderr (có thể gây nhiễu) và | grep "server name"
bộ lọc đường ống xuất ra để hiển thị tiện ích mở rộng TLS được gọi là "tên máy chủ" trong s_client
đầu ra gỡ lỗi mở rộng TLS.
Nếu bạn thấy một dòng đầu ra như
TLS server extension "server name" (id=0), len=0
sau đó máy chủ sẽ trả về thông tin tiêu đề SNI trong phản hồi ServerHello của nó. Nếu bạn không, thì có thể máy chủ không hỗ trợ SNI hoặc nó chưa được cấu hình để trả về thông tin SNI với tên bạn yêu cầu. Trong trường hợp này, hãy kiểm tra kỹ xem bạn có đang sử dụng tên miền trong -servername
tùy chọn mà máy chủ sẽ phản hồi với thông tin SNI không.
-servername
hay không. -servername sdfsdlkfjsdf23.somedomain.somewhere -connect realhost.somedomain.somewhere
= TLS server extension "server name" (id=0), len=0
(Và cùng một đầu ra nếu chúng khớp.) Làm thế nào để bạn xác minh nó không khớp với máy chủ trên máy chủ từ đầu ra?
-msg
ngoài các thông số ở trên và grep cho "Thông báo". Nếu -servername
sai, bạn sẽ nhận được một cái gì đó như TLS 1.2 Alert ... warning unrecognized_name
từ máy chủ. @Meitar Tôi nghĩ rằng nếu bạn thêm nó vào câu trả lời sẽ hữu ích cho người khác.
-msg
tắc chỉ cần thêm một chuỗi các thông điệp giao thức TLS. Không bắt buộc phải quan sát lỗi bắt tay TLS, vì vậy sẽ không chính xác khi thêm vào câu trả lời này. Ngoài ra, các lỗi bắt tay TLS như thế này được in ra STDOUT, điều đó có nghĩa là 2>/dev/null
cần phải xóa khỏi câu trả lời để xử lý grep
ngay từ đầu. Điều mà @bshea thực sự yêu cầu là "Làm cách nào để phát hiện lỗi TLS?" đó là một câu hỏi hoàn toàn khác với câu hỏi "Máy chủ này có sử dụng tính năng SNI của giao thức TLS không?" đó là chủ đề ở đây.
STDERR
tệp văn bản, tôi cũng không gặp phải lỗi đó. Không có -msg
tôi không thể tìm thấy tùy chọn khác hiển thị các tin nhắn bắt tay. (sử dụng openssl 1.0.2q). Miễn là sự liên quan đến câu trả lời bạn có thể đúng.
Bạn có thể sử dụng openssl
để tìm nạp và truy vấn chứng chỉ.
openssl s_client -connect
openssl x509
grep
để tìm thông tin "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
Dòng cuối cùng hiển thị tất cả các mục SNI có trong certficate:
DNS:alice.sni.velox.ch, DNS:carol.sni.velox.ch
DNS:...
mục trên dòng cuối cùng hiển thị tất cả các tên SNI hợp lệ trong chứng chỉ.
openssl
. Một số chi tiết có sẵn:openssl s_client -servername alice.sni.velox.ch -tlsextdebug -msg -connect alice.sni.velox.ch:443
Một số dấu hiệu sử dụng SNI được đưa ra trong quá trình kiểm tra Qualys SSL .