ຫຸ້ມ SOCKS socket ດ້ວຍ TLS ໃນ Node.js
ຫຸ້ມ destination stream ທີ່ແພັກເກັດ socks ສົ່ງຄືນດ້ວຍ tls.connect ແລະ ຮັກສາ hostname ຂອງເວັບໄຊສຳລັບ SNI ແລະ ການກວດສອບໃບຢັ້ງຢືນ.
SocksClient.createConnection ສົ່ງຄືນ stream ທີ່ເຊື່ອມຕໍ່ກັບ destination ທີ່ຮ້ອງຂໍ. ສຳລັບ HTTPS stream ນັ້ນຍັງຕ້ອງການ TLS handshake ກ່ອນທີ່ຈະຂົນສົ່ງຄຳຮ້ອງ 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`
);
});
ລາຍຊື່ proxy SOCKS5 ໃຫ້ຜູ້ສະໝັກສຳລັບ host ແລະ port ຂອງ proxy. onTransportError ແລະ onResponseBytes ເປັນຂອງແອັບພລິເຄຊັນທີ່ມີຢູ່; ອັນທີສອງຕ້ອງແຍກ stream ຂອງການຕອບສະໜອງ HTTP. ຕ່ອນຂໍ້ມູນ TLS ບໍ່ແມ່ນຂໍ້ຄວາມ HTTP ທີ່ສົມບູນດ້ວຍຕົນເອງ.
servername ແມ່ນຊື່ DNS ຂອງ destination. tls.connect ລະດັບຕ່ຳຂອງ Node ບໍ່ເປີດ SNI ຕາມຄ່າເລີ່ມຕົ້ນ, ແລະ hostname ຂອງ proxy ບໍ່ແມ່ນຕົວຕົນໃບຢັ້ງຢືນຂອງເວັບໄຊ.
ເປີດການກວດສອບໃບຢັ້ງຢືນໄວ້. ການໃຫ້ socket ທີ່ເຊື່ອມຕໍ່ແລ້ວຊ່ວຍຫຼີກລ້ຽງການເປີດການເຊື່ອມຕໍ່ກົງແຍກຕ່າງຫາກໄປຫາເວັບໄຊ ພ້ອມຮັກສາຕົວຕົນ TLS ຂອງມັນ.
timeout ຂອງ SOCKS ຈຳກັດການເຈລະຈານັ້ນ. ການແລກປ່ຽນ TLS ແລະ ແອັບພລິເຄຊັນຕໍ່ມາຍັງຕ້ອງການ timeout, ການຍົກເລີກ ແລະ ນະໂຍບາຍການລຶບລ້າງຕາມທີ່ຜູ້ເອີ້ນຕັ້ງໃຈ.