Περιτύλιξη υποδοχής SOCKS με TLS στο Node.js
Τυλίξτε τη ροή προορισμού που επιστρέφει το πακέτο socks με tls.connect και διατηρήστε το όνομα κεντρικού υπολογιστή του ιστότοπου για SNI και επαλήθευση πιστοποιητικού.
Το SocksClient.createConnection επιστρέφει μια ροή συνδεδεμένη με τον ζητούμενο προορισμό. Για HTTPS, αυτή η ροή χρειάζεται ακόμη χειραψία TLS πριν μεταφέρει το αίτημα 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`
);
});
Η λίστα διαμεσολαβητών SOCKS5 παρέχει υποψηφίους για τον κεντρικό υπολογιστή και τη θύρα του διαμεσολαβητή. Τα onTransportError και onResponseBytes ανήκουν στην υπάρχουσα εφαρμογή· το δεύτερο πρέπει να αναλύει τη ροή απόκρισης HTTP. Τα τμήματα δεδομένων TLS δεν είναι ανεξάρτητα πλήρη μηνύματα HTTP.
Το servername είναι το όνομα DNS του προορισμού. Το tls.connect χαμηλού επιπέδου του Node δεν ενεργοποιεί SNI από προεπιλογή, και το όνομα του διαμεσολαβητή δεν είναι η ταυτότητα πιστοποιητικού του ιστότοπου.
Διατηρήστε ενεργή την επαλήθευση πιστοποιητικού. Η παροχή της συνδεδεμένης υποδοχής αποφεύγει το άνοιγμα ξεχωριστής άμεσης σύνδεσης με τον ιστότοπο, διατηρώντας την ταυτότητα TLS του.
Το χρονικό όριο του SOCKS περιορίζει αυτή τη διαπραγμάτευση. Η μεταγενέστερη ανταλλαγή TLS και εφαρμογής χρειάζεται ακόμη το χρονικό όριο, την ακύρωση και την πολιτική καθαρισμού που προβλέπει ο καλών.