React-native websocket TLS连接

Posted

技术标签:

【中文标题】React-native websocket TLS连接【英文标题】:React-native websocket TLS Connection 【发布时间】:2016-11-04 15:50:08 【问题描述】:

我正在尝试使用 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。这是因为服务器使用自签名证书。

有没有办法解决这个问题?

【问题讨论】:

【参考方案1】:

回复有点晚,但希望这可以为其他人指明正确的方向。

我相信您收到的错误表明您缺少证书链文件,该文件用于验证用于签署服务器证书的 CA 是否有效,即信任链是否有效。

但是,如果您使用自签名证书,这通常会失败(至少很麻烦)。如果您需要帮助生成一些自签名证书和适当的证书链,可以查看here。另外,请查看您是否需要通过让客户端在连接时将该文件用作参数来指定受信任的 CA。

我一直在努力使用自签名证书设置安全的 websocket 服务器(出于开发目的,在生产中必须使用适当的证书/CA),但没有取得太大成功并恢复使用非 TLS websocket 服务器。

【讨论】:

【参考方案2】:

如果其他人碰巧在 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 连接,否则就无法正常工作。

【讨论】:

我怀疑如果我们更改端口,服务器将如何响应。因为很多服务器都是专门监听特定端口的,如果我们把端口默认改成 443 可能就不行了吧?就我而言,当我更改端口时,我收到了无法连接错误。

以上是关于React-native websocket TLS连接的主要内容,如果未能解决你的问题,请参考以下文章

React-native websocket TLS连接

React Native 和使用 websockets

React Native 和 Websockets (sockets.io) 的 XMLHttpRequest 错误

React-Native 上的连接升级

react-native this.setState 导致代码停止运行

为啥 MongooseIM 会在 60 秒后关闭 websocket 连接?