پیچیدن سوکت SOCKS با TLS در Node.js
جریان مقصدی را که بسته socks برمیگرداند با tls.connect بپیچید و نام میزبان وبسایت را برای SNI و بررسی گواهی حفظ کنید.
SocksClient.createConnection جریانی متصل به مقصد درخواستی برمیگرداند. برای HTTPS آن جریان هنوز پیش از انتقال درخواست 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 را تجزیه کند. تکههای داده TLS بهطور مستقل پیامهای کامل HTTP نیستند.
servername نام DNS مقصد است. tls.connect سطح پایین Node بهطور پیشفرض SNI را فعال نمیکند و نام میزبان پراکسی همان هویت گواهی وبسایت نیست.
بررسی گواهی را فعال نگه دارید. سپردن سوکت متصل، باز کردن اتصال مستقیم جداگانه به وبسایت را حذف میکند و هویت TLS آن را حفظ میکند.
مهلت SOCKS آن مذاکره را محدود میکند. تبادل بعدی TLS و برنامه هنوز به مهلت، لغو و سیاست پاکسازی مورد نظر فراخوان نیاز دارد.