Java 通过socket over SOCKS代理从HTTPS请求中执行SSLException

Java 通过socket over SOCKS代理从HTTPS请求中执行SSLException,java,node.js,sockets,https,socks,Java,Node.js,Sockets,Https,Socks,这里是网络新手。我正试图使用“socks”npm模块通过socks代理从Node JS服务器向javahttps服务器发送https请求。我可以通过代理发出单独的https请求,而无需套接字,例如使用“socks5 https client”npm模块 我期望从我的请求返回一个200 OK的响应,但是Java服务器抛出一个SSLException:无法识别的SSL消息,明文连接错误 我的Node JS代码非常简单: const options = { proxy: { host:

这里是网络新手。我正试图使用“socks”npm模块通过socks代理从Node JS服务器向javahttps服务器发送https请求。我可以通过代理发出单独的https请求,而无需套接字,例如使用“socks5 https client”npm模块

我期望从我的请求返回一个200 OK的响应,但是Java服务器抛出一个SSLException:无法识别的SSL消息,明文连接错误

我的Node 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
}
在谷歌搜索了很多次之后,我认为问题是因为“socks”模块使用了net.Socket,这是不安全的。但是,当我将其切换到tls.TLSSocket时,会导致代理连接超时


如何通过代理连接套接字并发送https请求?我的想法有问题吗?

非常感谢戴夫·汤普森。在将返回的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);
          });
Socks.SocksClient.createConnection(选项)
。然后(信息=>{
const tlsSocket=tls.connect(
{
主持人:,
港口:443,
socket:info.socket
},
() => {
tlsSocket.write('GET/users HTTP/1.1\r\n授权:Basic\r\nHost::443\r\n\r\n');
}
);
tlsSocket.on(“数据”,函数(数据){
//处理数据
});
})
.catch(错误=>{
控制台日志(err);
});

您需要向代理使用“普通”(TCP)套接字向其发送连接信息,然后在代理连接上向appserver发送TLS协议。简而言之,使用tls.TLSSocket(带有合适的选项)包装info.socket。此外,您的HTTP是非标准的,并且是不可靠的。HTTP头行必须由CR LF(Java和JS)终止,\r\n而不仅仅是\n。服务器应该寻找除了EOF之外甚至是EOF的结束标头的空行,因为TLS(至少通过1.2)客户端不能半闭,再加上AfICT袜子不指定半闭,所以即使TCP也不会依赖它。对于HTTP/1.1,Host:header也是必需的(尽管有些服务器,比如您的服务器,并不关心它)。
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);
          });