Điểm:0

Thiếu tiêu đề SNI từ Máy khách TLS Xin chào khi sử dụng proxy HTTP

lá cờ ar

Tôi đang gỡ lỗi sự cố với ứng dụng dựa trên Java truy xuất tải trọng JSON (danh sách CVE từ NIST) qua HTTPS. Khi tôi kết nối trực tiếp với NIST, tôi đã truy xuất dữ liệu thành công. Khi tôi sử dụng proxy HTTP, tôi gặp lỗi "tên không được nhận dạng" TLS cho biết có sự cố với Chỉ định tên máy chủ.

Tôi không có quyền truy cập vào mã của ứng dụng Java và có khả năng tối thiểu để gây rối với cài đặt JVM. Do đó, tôi đã trực tiếp thực hiện một số thử nghiệm riêng biệt bằng cách sử dụng openssl và tôi có thể tái tạo sự cố ở một mức độ nào đó với điều này.

Khi tôi tcpdump cuộc gọi sau, tôi có thể thấy phần mở rộng server_name có trong gói Client Hello:

openssl s_client -kết nối dịch vụ.nvd.nist.gov:443

Wireshark hiển thị phần mở rộng tên máy chủ

Tuy nhiên, nếu tôi gửi cái này qua proxy Squid của mình và kết xuất các gói giữa proxy và máy chủ đích bằng thông tin sau, thì không có phần mở rộng server_name nào có trong gói Client Hello:

openssl s_client -connect services.nvd.nist.gov:443 -proxy myproxy:3128

Phản hồi từ openssl là:

140012895368512:error:14094458:SSL routines:ssl3_read_bytes:tlsv1 unrecognized name:../ssl/record/rec_layer_s3.c:1543:SSL số cảnh báo 112
---
không có chứng chỉ ngang hàng
---

Và chúng ta có thể thấy rằng không có mục server_name nào trong gói:

WireShark hiển thị phần mở rộng bị thiếu

Tôi tin rằng đây là lý do máy chủ đích trả về lỗi (mặc dù theo những gì tôi hiểu thì nó phải trả về chứng chỉ mặc định trong tình huống này).

Bây giờ tôi có thể thực hiện công việc này bằng cách sử dụng proxy bằng cách chỉ định tên máy chủ theo cách thủ công:

openssl s_client -connect services.nvd.nist.gov:443 -proxy myproxy:3128 -servername nvd.nist.gov

Tôi hiểu rằng proxy chỉ tạo đường hầm cho dữ liệu TLS và không nên sửa đổi dữ liệu đó, do đó, nó gợi ý rằng openssl đang chọn không gửi thông tin tiện ích mở rộng tên máy chủ khi sử dụng proxy. Tại sao điều này sẽ được?

(Rõ ràng là trong trường hợp openssl, tôi chỉ có thể chỉ định tham số tên máy chủ, nhưng với ứng dụng Java, tôi không có được điều xa xỉ này. Tôi hy vọng nếu tôi có thể hiểu tại sao openssl chọn không gửi thông tin chi tiết SNI qua proxy, thì có thể làm sáng tỏ lý do tại sao Java dường như làm như vậy.)

Steffen Ullrich avatar
lá cờ se
Đối với tôi, có vẻ như có một lỗi là `openssl s_client` không gửi tên máy chủ theo mặc định khi proxy được sử dụng. Nhưng tôi có thể tạo lại sự cố với OpenSSL 1.1.1h và 1.1.1f. Nhưng s_client không phải là Java nên tôi cho rằng những vấn đề này có những nguyên nhân khác nhau.
Gordon Mckeown avatar
lá cờ ar
Cảm ơn bạn đã dành thời gian để tạo lại sự cố, @SteffenUllrich. Đồng ý, họ cũng có thể có những nguyên nhân khác nhau; có vẻ như là một sự trùng hợp kỳ lạ khi cả hai dường như thể hiện cùng một hành vi, vì vậy tôi tự hỏi liệu có điều gì đó về việc sử dụng proxy quy định hành vi TLS khác nhau hay không. Ngoài ra, việc kiểm tra và giải thích vấn đề bằng cách sử dụng openssl sẽ dễ dàng hơn rất nhiều :). Tôi đã mở một [lỗi](https://github.com/openssl/openssl/issues/17232) đối với openssl.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.