来自 HTTPS 请求的 SSLException 通过 SOCKS 代理上的套接字
SSLException from HTTPS Request through socket over SOCKS Proxy
这里是互联网新手。我正在尝试使用 'socks' npm 模块通过 socks 代理从 Node JS 服务器发送 https 请求到 Java 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
}
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请求?我的思路有问题吗?
非常感谢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);
});
这里是互联网新手。我正在尝试使用 'socks' npm 模块通过 socks 代理从 Node JS 服务器发送 https 请求到 Java 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
}
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请求?我的思路有问题吗?
非常感谢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);
});