Làm cách nào để phát hiện nếu máy chủ đang sử dụng SNI cho HTTPS?


41

Tôi đang tìm kiếm một cách đơn giản để biết liệu máy chủ có đang sử dụng tiện ích mở rộng SSL Chỉ định tên máy chủ cho chứng chỉ HTTPS trên trang web hay không. Một phương pháp sử dụng trình duyệt hoặc dòng lệnh Unix là tốt.

Cảm ơn!

Câu trả lời:


20

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ả:

  • Bạn nhận được một chứng chỉ ký tự đại diện (hoặc một chứng chỉ có chủ đềAltName) bao gồm cả hai tên: bạn không học được gì
  • Bạn nhận được chứng chỉ sai cho ít nhất một trong số họ: máy chủ không hỗ trợ SNI hoặc nó đã được cấu hình sai
  • Bạn nhận được hai chứng chỉ khác nhau, cả hai đều có tên chính xác: SNI được hỗ trợ và được cấu hình đúng.

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ợ:

Xin chào khách hàng Xin chào máy chủ

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.


9
Dennis - không đồng ý 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:443Một số dấu hiệu sử dụng SNI được đưa ra trong quá trình kiểm tra Qualys SSL .
Deer Hunter

Ah, tôi đã bỏ lỡ điều đó trong trang web. Cảm ơn đã bổ sung.
Dennis Kaarsemaker

26

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.comlà giá trị SNI bạn đang thử nghiệm và www.YOURSERVER.comlà 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.comcổng 443. Các -tlsextdebuglượt tùy chọn trên phần mở rộng TLS gỡ lỗi đầu ra. Các -servernametùy chọn kể s_clientchương trình để vượt qua www.SERVERNAME.comnhư 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/nullchỉ 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 -servernametùy chọn mà máy chủ sẽ phản hồi với thông tin SNI không.


1
Đầu ra là như nhau cho dù tôi sử dụng đúng -servernamehay 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?
bshea

1
@bshea Bạn cần vượt qua -msgngoài các thông số ở trên và grep cho "Thông báo". Nếu -servernamesai, bạn sẽ nhận được một cái gì đó như TLS 1.2 Alert ... warning unrecognized_nametừ 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.
Viktor Nonov

@ViktorNonov Công -msgtắ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/nullcần phải xóa khỏi câu trả lời để xử lý grepngay 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.
Meitar

@Meitar, tôi không thể tìm thấy một cách khác để quan sát các tin nhắn bắt tay TLS. Ngoài ra ngay cả khi tôi chuyển hướng STDERRtệp văn bản, tôi cũng không gặp phải lỗi đó. Không có -msgtô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.
Viktor Nonov

-2

Bạn có thể sử dụng opensslđể tìm nạp và truy vấn chứng chỉ.

  • lấy chứng chỉ với openssl s_client -connect
  • phân tích chứng chỉ với 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

Tôi đang tìm kiếm gì ở đầu ra đó? Thực tế là nhiều tên miền có mặt?
spookylukey

Các 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ỉ.
spazm

4
SAN trong một chứng chỉ và hỗ trợ SNI trên máy chủ là những điều khác nhau, việc sử dụng SAN cho HTTPS virtualhosting là một thứ gì đó có trước hack SNI. Đối với SNI, bạn không cần chứng chỉ với SAN vì máy chủ có thể chọn chứng chỉ riêng phù hợp với mong muốn của khách hàng.
mr.spuratic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.