websocket使用ssl链接不上服务器(已解决)

第一次提问,创建问题时没有添加描述

现在问题描述的挺好的,可惜我没用过SSL,提供不了帮助,希望引擎组重视你这个问题

1赞

问题已经解决了,具体过程我给大家描述清楚一点:

首先可以确定问题出在openssl 层次上,证书是不正确的。

证书申请:申请证书的的时候,申请者可以获取服务端证书(ssl)文件和秘钥(key)文件,还有一个中间证书,这是是重中之重。

服务端配置:服务端配置好服务端用的证书以及客户端用的证书之后,客户端 cocos create打包安卓程序开始连接,然后无论如何都连接不上。

第一个问题:客户端链接不上服务器,报“没有设置根证书”的错误

第一个问题解决:使用var ws = new WebSocket("wss://h5.zltianhen.com/uc", null, cc.url.raw("证书文件"));的方式跳过了该错误

第二个问题:继续打包运行,报证书验证失败的错误"certificate verify failed"。

第二个问题解决:
1. 先测试服务端的和客户端是否都运行正常,让浏览器访问一下服务器,结果正常,让安卓包打包的程序访问一下其他wss建议的服务器,结果正常。于是我得出这个错误很明显出在openssl内部校验的问题上,但是还需要验证一下。
2. 使用openssl工具来测试ca文件是否正常,openssl命令:
openssl s_client -showcerts -connect "链接地址" -servername "链接中的host(example.com)" -CAfile "ca文件"
如果该命令成功了,则说明这个ca文件是对的,失败了则说明ca文件是错的
3. 使用申请证书时第三方所给予的中间链文件,重要的事情说三遍,中间链文件,中间链文件,中间链文件来执行openssl命令,然后openssl工具将会报错,缺少根证书文件。
4. 使用浏览器去下载你的根证书文件(der编码),下载成功后,打开根证书文件,复制内容,直接粘贴到你的中间链文件的最后面中,从而获得一个新的证书文件
5. 再次使用Openssl命令,用刚合成的证书文件去测试,测试通过。
6. 使用刚合成的证书文件打包安卓app,wss链接成功。

8赞

中间链文件是哪个?怎么拿到?2、3、4、5步有没有详细的教程?

你申请证书的时候,如果给了你中间链证书,那你就有,如果没有给你,那你就没有

我觉得楼主说的很清楚的啊

我也遇到了这个问题,wss在iOS/Windows/微信/Web(chrome)平台都能链接成功,唯独在android上报证书验证错误certificate verify failed,然而证书用openssl命令验证确是通过的:

  1. 使用openssl工具来测试ca文件是否正常,openssl命令:
    openssl s_client -showcerts -connect “链接地址” -servername “链接中的host(example.com)” -CAfile “ca文件”

调试了服务器代码,的确是在握手时客户端证书验证不通过,至于为啥不通过,没闹明白。

后来想想,现在访问https网站时,都是单向验证,客户端都不用自带证书的,就换了一种思路解决:
cocos的websocket原生平台在iOS平台是用iOS提供的OC库,其他平台用的都是libwebsockets开源库,而且版本略老,是2.1.0版(2016年发的)。
我就把android平台的websocket实现改成了java的开源库:Java-WebSocket,通过jni调用实现了WebSocketImpl,之后Android平台就能正常使用wss了,也不用带什么证书。

根据网站xxx.pem获取安卓websocket所需的根证书的方法

  1. 第一步,打开window操作系统 (mac下面不知道怎么导出证书)
  2. 第二部, 将网站证书xxxx.pem更名为xxx.cer
  3. 第三部, 双击xxx.cer
    * 选择[证书路径]选项卡
    * 鼠标点击下方证书树的根节点
    * 鼠标点击下方查看证书按钮
    * 点击[证书详情]选项卡
    * 点击[导出证书]
    * 选择 base64模式
    导出的文件就是 安卓Websocket第三个参数所需的文件
7赞

您好,我遇到这个问题,卡了好长时间,想请教您下具体的实现,不知道能否加一下好友,感激不尽

我用楼上的方法导出根证书试了是可行的,不用改引擎底层,至于为什么不想深究了,按理客户端是不用带证书的。我建议还是不要动引擎底层吧,不然以后升级引擎很麻烦,你就按楼上的方法用导出的根证书而不是用服务器的证书。

根据网站xxx.pem获取安卓websocket所需的根证书的方法

  1. 第一步,打开window操作系统 (mac下面不知道怎么导出证书)
  2. 第二部, 将网站证书xxxx.pem更名为xxx.cer
  3. 第三部, 双击xxx.cer
    * 选择[证书路径]选项卡
    * 鼠标点击下方证书树的根节点
    * 鼠标点击下方查看证书按钮
    * 点击[证书详情]选项卡
    * 点击[导出证书]
    * 选择 base64模式
    导出的文件就是 安卓Websocket第三个参数所需的文件

另外如果是win7系统,导出证书按钮就是在证书详细信息页签有个“复制到文件”按钮

3赞

导出这个这个文件后仍然无效啊,郁闷中,可否提供点帮助

1赞

如果证书路径问题,可以参考 http://forum.cocos.com/t/websocket/67895/2?u=544811043

貌似使用cocos官方测试案列里的ca证书也是可以的

1赞

请问楼主,websocket你们能够在原生android与iOS上连通不

你好,cocos creator的websocket没有第三个设置证书的参数呢。

这个方法好使

同样使用这个方案解决。

1赞

请问websocket怎么设置的?
我的websocket 没有第三个参数可以设置

        let pemUrl = cc.url.raw("resources/cacert.pem");
        this.websocket = new WebSocket(url,null,pemUrl);

会冒红字

// 直接复制这段代码用吧,pem 需要转换成 cer ,方法看楼上
var pemUrl = cc.url.raw('resources/ssl/android.cer')
if(cc.loader.md5Pipe) {
  pemUrl = cc.loader.md5Pipe.transformURL(pemUrl)
  console.log(pemUrl)
  window.ws = new WebSocket(url, null, pemUrl);
} else {
  cc.log('cc.loader.md5Pipe:', cc.loader.md5Pipe)
}

出现 cc.loader.md5Pipe: undefined
还是要打包出来才有?
目前是用模拟器