Node.js дээр SOCKS сокетыг TLS-ээр ороох
socks багцаас буцаах destination stream-ийг tls.connect-ээр ороож, SNI болон сертификатын баталгаажуулалтад зориулж вэбсайтын хост нэрийг хадгал.
SocksClient.createConnection хүссэн destination-т холбогдсон stream буцаана. HTTPS-ийн хувьд энэ stream HTTP хүсэлтийг зөөхөөс өмнө TLS гар барилт шаардлагатай хэвээр.
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 прокси жагсаалт прокси хост болон портын нэр дэвшигчдийг өгдөг. onTransportError ба onResponseBytes нь одоо байгаа аппликейшнд хамаарна; хоёр дахь нь HTTP хариуны stream-ийг задлан шинжлэх ёстой. TLS өгөгдлийн хэсгүүд бие даасан бүрэн HTTP мессеж биш.
servername бол destination-ийн DNS нэр юм. Node-ийн доод түвшний tls.connect анхдагчаар SNI-г идэвхжүүлдэггүй бөгөөд прокси хост нэр нь вэбсайтын сертификатын таних тэмдэг биш.
Сертификатын баталгаажуулалтыг асаалттай байлга. Холбогдсон сокетыг өгөх нь вэбсайт руу тусдаа шууд холболт нээхээс зайлсхийж, түүний TLS таних тэмдгийг хадгална.
SOCKS-ийн хугацаа хэтэрэлт тэр хэлэлцээрийг хязгаарлана. Дараагийн TLS болон аппликейшны солилцоо дуудагчийн зорьсон хугацаа хэтэрэлт, цуцлалт, цэвэрлэгээний бодлогыг шаардсаар байна.