Điểm cuối SOCKS đưa bạn đến trang web. Đối tác TLS bên trong kết nối đó chính là trang web, nên hãy truyền tên máy chủ của đích đến cho nhà máy socket phân lớp:

String destination = "example.com";
int destinationPort = 443;
Proxy proxy = new Proxy(
    Proxy.Type.SOCKS,
    new InetSocketAddress("127.0.0.1", 1080)
);

try (Socket transport = new Socket(proxy)) {
    transport.connect(
        InetSocketAddress.createUnresolved(destination, destinationPort),
        5000
    );
    SSLSocketFactory factory =
        (SSLSocketFactory) SSLSocketFactory.getDefault();
    try (SSLSocket tls = (SSLSocket) factory.createSocket(
            transport, destination, destinationPort, true)) {
        SSLParameters parameters = tls.getSSLParameters();
        parameters.setEndpointIdentificationAlgorithm("HTTPS");
        tls.setSSLParameters(parameters);
        tls.setSoTimeout(15000);
        tls.startHandshake();
        // Send the application's HTTPS request through tls.
    }
}

Đoạn mã giả định các import Java networking và TLS tiêu chuẩn, cấu hình tin cậy mặc định hiện có và kết nối SOCKS không cần thông tin đăng nhập proxy. Nó thực hiện bắt tay; ứng dụng vẫn cần gửi yêu cầu HTTP theo định dạng máy chủ mong đợi. Với các đích HTTPS công khai trên tuyến công khai được phép, danh sách proxy SOCKS cung cấp các điểm cuối ứng viên; khớp phiên bản máy chủ và hỗ trợ tên máy chủ với đường socket Java này.

Đọc hai danh tính trong ví dụ

127.0.0.1:1080 là điểm cuối proxy, có thể truy cập từ tiến trình Java này. destination và destinationPort xác định trang web. createUnresolved giữ tên máy chủ đó cho đường SOCKS thay vì phân giải sớm ở phía máy khách.

createSocket phân lớp nhận danh tính của đích đến. setEndpointIdentificationAlgorithm("HTTPS") yêu cầu rõ ràng các kiểm tra tên máy chủ của nó. Sự tin cậy chuỗi chứng chỉ của một SSLSocket thô tự nó không chứng minh rằng việc xác minh tên máy chủ đã được bật. Thay tên proxy hoặc loopback để triệt tiêu sự không khớp có thể xác thực sai điểm cuối.

Giữ sự tin cậy và việc dọn dẹp theo từng giai đoạn

Nhà máy mặc định dùng cách bố trí tin cậy đã cấu hình của JVM. Ứng dụng có yêu cầu riêng có thể dùng nhà máy SSLContext đã khởi tạo đúng cách của mình. Lựa chọn đó tách biệt với tuyến SOCKS; một trình quản lý tin cậy chấp nhận mọi chứng chỉ không sửa được tên đối tác sai.

Từ chối SOCKS xảy ra trước TLS; chứng chỉ không tin cậy hoặc tên máy chủ sai sẽ thất bại trong TLS; sau đó có thể có lỗi HTTP. Đăng nhập proxy cho phép yêu cầu đường hầm chứ không xác thực trang web bên trong.

Đóng socket phân lớp khi bật tự động đóng sẽ đóng phương tiện truyền của nó. Phạm vi tài nguyên bên ngoài cũng đóng phương tiện đó nếu việc bao bọc hoặc bắt tay thất bại trước khi hoàn tất bình thường.

Bài viết liên quan