Indpak en SOCKS-socket med TLS i Node.js
Indpak destinationsstrømmen fra socks-pakken med tls.connect, og bevar webstedets værtsnavn til SNI og certifikatvalidering.
SocksClient.createConnection returnerer en strøm, der er forbundet til den ønskede destination. Til HTTPS skal den strøm stadig gennemgå et TLS-håndtryk, før den bærer HTTP-anmodningen.
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-proxylisten leverer kandidater til proxyens vært og port. onTransportError og onResponseBytes hører til den eksisterende applikation; sidstnævnte skal parse HTTP-svarstrømmen. TLS-datastykker er ikke i sig selv komplette HTTP-beskeder.
servername er destinationens DNS-navn. Nodes lavniveau-tls.connect aktiverer ikke SNI som standard, og proxyens værtsnavn er ikke webstedets certifikatidentitet.
Lad certifikatvalidering være slået til. Når du angiver den tilsluttede socket, undgås en separat direkte forbindelse til webstedet, samtidig med at dets TLS-identitet bevares.
SOCKS-timeoutet begrænser den forhandling. Den senere TLS- og applikationsudveksling kræver stadig kalderens tilsigtede timeout, annullering og oprydningspolitik.