Node.js ਵਿੱਚ SOCKS ਸਾਕਟ ਨੂੰ TLS ਨਾਲ ਲਪੇਟਣਾ
socks ਪੈਕੇਜ ਵਾਪਸ ਕਰਦਾ destination stream ਨੂੰ tls.connect ਨਾਲ ਲਪੇਟੋ ਅਤੇ SNI ਤੇ ਸਰਟੀਫਿਕੇਟ ਪੁਸ਼ਟੀ ਲਈ ਵੈੱਬਸਾਈਟ ਦਾ hostname ਬਣਾਈ ਰੱਖੋ।
SocksClient.createConnection ਬੇਨਤੀ ਕੀਤੀ destination ਨਾਲ ਜੁੜਿਆ stream ਵਾਪਸ ਕਰਦਾ ਹੈ। HTTPS ਲਈ ਉਸ stream ਨੂੰ HTTP ਬੇਨਤੀ ਲੈ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਹਾਲੇ ਵੀ TLS handshake ਚਾਹੀਦਾ ਹੈ।
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 ਪਰਾਕਸੀ ਸੂਚੀ ਪਰਾਕਸੀ host ਅਤੇ port ਲਈ ਉਮੀਦਵਾਰ ਦਿੰਦਾ ਹੈ। onTransportError ਅਤੇ onResponseBytes ਮੌਜੂਦਾ ਐਪਲੀਕੇਸ਼ਨ ਦੇ ਹਨ; ਦੂਜੇ ਨੂੰ HTTP response stream ਪਾਰਸ ਕਰਨਾ ਪੈਂਦਾ ਹੈ। TLS ਡੇਟਾ ਟੁਕੜੇ ਸੁਤੰਤਰ ਤੌਰ ਤੇ ਪੂਰੇ HTTP ਸੁਨੇਹੇ ਨਹੀਂ।
servername destination ਦਾ DNS ਨਾਮ ਹੈ। Node ਦਾ ਨਿਊਨ-ਪੱਧਰੀ tls.connect ਡਿਫਾਲਟ ਰੂਪ ਵਿੱਚ SNI ਸਮਰੱਥ ਨਹੀਂ ਕਰਦਾ, ਅਤੇ ਪਰਾਕਸੀ hostname ਵੈੱਬਸਾਈਟ ਦੀ ਸਰਟੀਫਿਕੇਟ ਪਛਾਣ ਨਹੀਂ ਹੈ।
ਸਰਟੀਫਿਕੇਟ ਪੁਸ਼ਟੀ ਚਾਲੂ ਰੱਖੋ। ਜੁੜਿਆ socket ਦੇਣ ਨਾਲ ਵੈੱਬਸਾਈਟ ਲਈ ਵੱਖਰਾ ਸਿੱਧਾ ਕਨੈਕਸ਼ਨ ਖੋਲ੍ਹਣ ਤੋਂ ਬਚਿਆ ਜਾਂਦਾ ਹੈ ਅਤੇ ਇਸ ਦੀ TLS ਪਛਾਣ ਬਣੀ ਰਹਿੰਦੀ ਹੈ।
SOCKS timeout ਉਸ ਗੱਲਬਾਤ ਨੂੰ ਸੀਮਿਤ ਕਰਦਾ ਹੈ। ਬਾਅਦ ਦੇ TLS ਅਤੇ ਐਪਲੀਕੇਸ਼ਨ ਵਟਾਂਦਰੇ ਲਈ ਹਾਲੇ ਵੀ ਕਾਲ ਕਰਨ ਵਾਲੇ ਦਾ ਇੱਛਤ timeout, ਰੱਦ ਕਰਨਾ ਅਤੇ ਸਫਾਈ ਨੀਤੀ ਚਾਹੀਦੀ ਹੈ।