Înfășurarea unui socket SOCKS cu TLS în Node.js
Înfășurați fluxul de destinație returnat de pachetul socks cu tls.connect și păstrați numele de gazdă al site-ului pentru SNI și verificarea certificatului.
SocksClient.createConnection returnează un flux conectat la destinația solicitată. Pentru HTTPS, acel flux mai are nevoie de un handshake TLS înainte de a transporta cererea 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`
);
});
Lista de proxy SOCKS5 furnizează candidați pentru gazda și portul proxy-ului. onTransportError și onResponseBytes aparțin aplicației existente; al doilea trebuie să analizeze fluxul de răspuns HTTP. Fragmentele de date TLS nu sunt mesaje HTTP complete în mod independent.
servername este numele DNS al destinației. tls.connect de nivel jos din Node nu activează SNI implicit, iar numele de gazdă al proxy-ului nu este identitatea certificatului site-ului.
Lăsați activă verificarea certificatului. Furnizarea socketului conectat evită deschiderea unei conexiuni directe separate către site și păstrează identitatea sa TLS.
Timeoutul SOCKS limitează acea negociere. Schimbul ulterior TLS și de aplicație are în continuare nevoie de timeoutul, anularea și politica de curățare intenționate de apelant.