SSLException от HTTPS-запроса через сокет через SOCKS Proxy - PullRequest
0 голосов
/ 12 октября 2019

Интернет-сеть новичка здесь. Я пытаюсь отправить https запросы с сервера Node JS с помощью npm-модуля socks через socks-прокси на сервер HTTPS Java. Я могу сделать отдельные запросы https через прокси без штрафа, например, с помощью модуля npm 'socks5-https-client'.

Я ожидаю ответ 200 OK на мой запрос, но вместо этого сервер Java выдаетисключение SSLE: нераспознанное сообщение SSL, ошибка соединения в виде открытого текста.

Код JS моего узла очень прост:

const options  = {
  proxy: {
    host: '<proxy ip>',
    port: 1080,
    type: 5
  },

  destination: {
    host: '<java server ip>',
    port: 443
  },

  command: 'connect'
};

try {
  const info = await SocksClient.createConnection(options);

  info.socket.write('GET /users HTTP/1.1\nAuthorization: Basic <token>\n\n');
  info.socket.on('data', (data) => {
    console.log(data.toString());
} catch (err) {
  // Handle errors
}

Код сервера Java:

SSLServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket listenSocket = (SSLServerSocket) ssf.createServerSocket(portNum, 50);

boolean done = false;
while (!done) {
    clientSocket = listenSocket.accept();
    if (Thread.currentThread().isInterrupted()) {
        Logger.logMessage("interrupted during accept()");
        done = true;
        break;
    }

    InputStream in  = clientSocket.getInputStream();

    // Read the initial request line from the client
    ByteArrayOutputStream inLineA = new ByteArrayOutputStream(100);
    int ch = -1;
    try {
        clientSocket.setSoTimeout(10000);
        while ((ch = in.read()) != '\n' && ch != -1)
            inLineA.write((byte) ch);
    }
    catch (Exception e) {
        e.printStackTrace(System.out);
        clientSocket.close();
        continue;
    }

[ ... process HTTP request here ]
}

ПослеЯ подумал, что проблема в том, что модуль socks использует net.Socket, который небезопасен. Однако, когда я выключаю его для tls.TLSSocket, это приводит к тайм-ауту соединения с прокси.

Как я могу подключить сокет через прокси и отправлять запросы https? Есть ли проблема с моим мышлением?

1 Ответ

0 голосов
/ 14 октября 2019

Большое спасибо dave_thompson_085. Он работал после переноса TCP-сокета, возвращенного в TLS-сокет, примерно так:

Socks.SocksClient.createConnection(options)
          .then(info => {
            const tlsSocket= tls.connect(
              {
                host: <java server ip>,
                port: 443,
                socket: info.socket
              },
              () => {
                tlsSocket.write('GET /users HTTP/1.1\r\nAuthorization: Basic <token>\r\nHost: <java server ip>:443\r\n\r\n');
              }
            );

            tlsSocket.on("data", function(data) {
              // do something with data
            });
          })
          .catch(err => {
            console.log(err);
          });
...