我正在尝试使用websocket使用react-native连接到TLS服务器。下面是我的代码(在windows + android上运行):
var ws = new WebSocket('wss://hub.fingi-staging.com:20020',{
rejectUnauthorized: false
});
ws.onopen = () => {
// connection opened
ws.send('something'); // send a message
};
ws.onmessage = (e) => {
// a message was received
console.log('message : ' + e.data);
};
ws.onerror = (e) => {
// an error occurred
console.log('error:'+e.message);
};
ws.onclose = (e) => {
// connection closed
console.log('close:'+e.code, e.reason);
};
但是,它失败了:error:java.security.cert.CertPathValidatorException: Trust anchor for certification path not found
。这是因为服务器使用自签名证书。
有什么方法可以解决这个问题吗?
答案 0 :(得分:1)
回复有点迟,但希望这可以指出其他人正朝着正确的方向发展。
我相信您收到的错误表明您缺少证书链文件,该文件用于验证用于签署服务器证书的CA是否有效,即信任链是否有效。< / p>
但是,如果您使用的是自签名证书,则通常会失败(至少很麻烦)。如果您需要一些帮助来生成一些自签名证书和相应的证书链,您可以查看here。此外,通过让客户端在连接时将该文件用作参数来查看是否需要指定受信任的CA.
我一直在努力使用自签名证书来设置安全的websocket服务器(出于开发目的,在生产中必须使用适当的证书/ CA)但是没有取得很大的成功并且还没有使用非-TLS websocket服务器。
答案 1 :(得分:1)
如果其他任何人碰巧在React-Native中实现安全的Websocket连接,这就是我今晚发现的:React-Native希望在使用安全的Websocket连接时使用端口443。
让我们以上面的代码作为原始海报。他有:
var ws = new WebSocket('wss://hub.fingi-staging.com:20020',{
rejectUnauthorized: false
});
我发现对我有用的是:
var ws = new WebSocket('wss://hub.fingi-staging.com');
然后在WebSocket服务器上,确保在443端口而不是20020端口(或以前使用的任何端口)上提供所有服务。例如,我的Python Websocket服务器以前使用的端口是8765。但是,在React-Native中,您需要使用端口443来进行安全的Websocket连接,否则根本无法正常工作。