Bọc socket SOCKS bằng TLS trong Node.js
Bọc luồng đích mà gói socks trả về bằng tls.connect và giữ nguyên tên máy chủ của trang web cho SNI và xác minh chứng chỉ.
SocksClient.createConnection trả về một luồng được kết nối tới đích đã yêu cầu. Với HTTPS, luồng đó vẫn cần bắt tay TLS trước khi mang theo yêu cầu HTTP.
import { SocksClient } from 'socks';
import tls from 'node:tls';
const targetHost = 'service.example';
const info = await SocksClient.createConnection({
proxy: { host: 'proxy.example', port: 1080, type: 5 },
command: 'connect',
destination: { host: targetHost, port: 443 },
timeout: 10000,
});
const secure = tls.connect({
socket: info.socket,
servername: targetHost,
});
secure.on('error', onTransportError);
secure.on('data', onResponseBytes);
secure.once('secureConnect', () => {
secure.write(
`GET /data HTTP/1.1\r\nHost: ${targetHost}\r\nConnection: close\r\n\r\n`
);
});
Danh sách proxy SOCKS5 cung cấp các lựa chọn cho máy chủ và cổng của proxy. onTransportError và onResponseBytes thuộc về ứng dụng hiện có; cái sau phải phân tích luồng phản hồi HTTP. Các mảnh dữ liệu TLS không phải là thông điệp HTTP hoàn chỉnh một cách độc lập.
servername là tên DNS của đích. tls.connect cấp thấp của Node không bật SNI theo mặc định, và tên máy chủ của proxy không phải danh tính chứng chỉ của trang web.
Hãy để xác minh chứng chỉ được bật. Cung cấp socket đã kết nối giúp tránh mở một kết nối trực tiếp riêng tới trang web mà vẫn giữ danh tính TLS của nó.
Thời gian chờ của SOCKS giới hạn cuộc đàm phán đó. Trao đổi TLS và ứng dụng sau đó vẫn cần thời gian chờ, hủy bỏ và chính sách dọn dẹp theo ý của bên gọi.