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
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:
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.)