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

搞了2个多小时总算搞定了:
下面是整理步骤:
注意:(证书在百度上有在线转换,可以把你当前的证书转换成pem格式的,然后走下面的教程)

【然后我们开始第一大步骤 导出一个base64的cer证书】
根据网站xxx.pem获取安卓websocket所需的根证书的方法

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

【第二大步骤】
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)
}

【异常1】:
cc.loader.md5Pipe
这个可能是空的需要判断一下 导出android版的时候勾选MD5Cache后,这个值就不是空的了

【异常2】:
new WebSocket(url, null, pemUrl); 本身第三个参数可能会报错,不用管尤其是 typescript下

【注意】
一定要编译成android版后在运行测试

其它平台需要单独判断下,要不然会报错

1赞

双击根本打不开cer,你们选择什么打开方式的。。。。

为什么我改为.cer后打开是无效的证书文件呢,你怎么双击xx.cer

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

这些步骤做不来,为啥我证书双击xxx.cer没用

大佬咋搞这个证书啊,现在我也是SL routines:tls_process_server_certificate:certificate verify failed

验证失败了,我怎么双击你cer没反应。

这个方案好,分享下憋,不用搞啥证书。。。

公司项目代码不能外传,只能提供思路你自己实现。
Java-WebSocket在github上:Java-WebSocket
java的封装和jni调用你只能自己实现了

感谢大神的方法,终于搞好了:slightly_smiling:

感谢兄弟 用自己的证书不行 用官方的就好了

12456

如果证书过期更换证书,服务器和客户端需要同时换,只能停服更新吗?有没有更换好的思路

你怎么解决的

关于你说的证书是这个吗

官网哪里呀,我怎么没有看到,可以发个链接给我不

正解,太强了

同问,官方有注意到这个问题吗/

感谢大佬,我的也成功了!!!啊啊啊啊啊

这个问题应该在新版本的2.x已经解决

18年的都还能挖 :rofl: :rofl: :rofl:

Cocos Creator 2.x 在 Android 平台使用 wss 加密协议握手失败

非入侵引擎式解决方案

客户端

在得到 中间和根证书 .cer 后需要转换为 Base64.cer 证书才能使用

转换步骤(Windows 11 系统环境)

  • 双击 中间和根证书.cer 文件,进行 Base64 的证书导出操作

  • 导出后将 cacert.cer 证书放入到 resources/ssl/ 目录下,在 new WebScoket() 时的第 3 个参数传入得到的原生路径

try {

    if (cc.sys.isNative && cc.sys.os == cc.sys.OS_ANDROID && url.startsWith("wss")) {

        let cacert = cc.url.raw('resources/ssl/cacert.cer');

        if (cc.loader.md5Pipe) {

            cacert = cc.loader.md5Pipe.transformURL(cacert);

        }

        //@ts-ignore

        this._websocket = new WebSocket(url, null, cacert);

    } else {

        this._websocket = new WebSocket(url);

    }

} catch (e) {

    this.onError();

    this.onClose();

    return;

}

服务端

由于服务端使用 JAVA 开发,使用 .jks 的证书

  • 需要将 .cer / .pem 文件转换为 .pkcs12 文件后

  • 再将 .pkcs12 文件转换为 .jks 文件,供服务端使用


# 生成 .pkcs12

openssl pkcs12 -export -in 中间和根证书.cer -inkey 域名文件.key -certfile ca.cer -out 域名文件.p12 -name 别名 -password pass:密码


# 生成 .jks

keytool -importkeystore -srckeystore 域名文件.p12 -srcstoretype PKCS12 -srcstorepass 密码 -destkeystore 域名文件.jks -deststoretype JKS -deststorepass 密码 -alias 别名

注意事项

  1. 中间和根证书 .cer 一定是 full.cer,并非 域名.cer

  2. 如果是 .pem 证书,需将 .pem 的后缀改为 .cer 后再进行 Base64 证书转换导出