Node.js-də SOCKS soketini TLS ilə bükmək
socks paketinin qaytardığı təyinat axınını tls.connect ilə bükün və SNI ilə sertifikat yoxlaması üçün saytın host adını qoruyun.
SocksClient.createConnection tələb olunan təyinatla bağlı bir axın qaytarır. HTTPS üçün bu axın hələ də HTTP sorğusunu daşımazdan əvvəl TLS əl sıxmasına ehtiyac duyur.
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`
);
});
SOCKS5 proxy siyahısı proxy host və portu üçün namizədlər verir. onTransportError və onResponseBytes mövcud tətbiqə aiddir; ikincisi HTTP cavab axınını analiz etməlidir. TLS data parçaları müstəqil şəkildə tam HTTP mesajları deyil.
servername təyinatın DNS adıdır. Node-un aşağı səviyyəli tls.connect funksiyası SNI-ı defolt olaraq aktiv etmir və proxy host adı saytın sertifikat kimliyi deyil.
Sertifikat yoxlamasını aktiv saxlayın. Qoşulmuş soketi təqdim etmək TLS kimliyini qoruyaraq sayta ayrı bir birbaşa bağlantı açmağın qarşısını alır.
SOCKS zaman aşımı həmin danışıqları məhdudlaşdırır. Sonrakı TLS və tətbiq mübadiləsi hələ də çağıranın nəzərdə tutduğu zaman aşımı, ləğv və təmizləmə siyasətini tələb edir.