You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

加入房间时Turnserver报WebSocket open error及TLS证书异常问题求助

问题描述

我的应用具备1对1视频通话功能,为此我自行搭建了专属Turnserver,该服务此前一直运行稳定,昨日起出现连接异常:应用发起呼叫时Turnserver直接拒绝连接,我从浏览器访问Turnserver地址也出现如下报错:
输入图片描述

我随即查看collidermain日志,输出内容如下:

root@<machine_name>:~# <timestamp> Starting collider: tls = true, port = 8443, room-server=https://<mydomain>.com
<timestamp> http: TLS handshake error from 182.160.105.186:43243: remote error: tls: unknown certificate

每次我的应用尝试连接Turnserver时,都会重复生成上述报错日志。

我初步怀疑是SSL证书问题,已更换SSL证书,尝试重新安装collidermain,重启google-cloud-sdk、Turnserver、collidermain服务,但问题仍未解决。

同类问题中提到的Chrome bug可能性已排除,我提问时另外两台Turnserver运行正常,服务器健康状态良好。重新安装collider的方案也无效,问题仍未解决。

系统配置

  • 操作系统:Ubuntu 20.04
  • 基于Google-cloud-sdk运行AppRTC代码,版本:330.0.0
  • Turnserver版本:4.4.3
  • 信令服务器:collidermain
  • 证书由Let's Encrypt certbot签发

核心疑问

该错误的根本原因是什么,应当如何修复?


根本原因

核心是TLS证书加载异常导致握手失败,具体可分为以下几类常见情况:

  1. collidermain启动参数配置的证书路径错误,或只配置了cert.pem未配置fullchain.pem,缺少证书信任链导致客户端判定证书未知
  2. 证书文件权限不足,collidermain运行身份无权限读取Let's Encrypt生成的证书文件
  3. Turnserver配置文件中绑定的仍是旧证书,和新换的证书不匹配
  4. 重启服务时未完全杀死旧的collidermain进程,旧进程仍加载旧证书对外提供服务
  5. 开启了certbot自动续期但未配置续期后重启钩子,证书自动更新后相关服务未加载新证书

修复步骤
  1. 修正collidermain启动参数
    collidermain启动时需要显式指定完整证书链和私钥路径,示例启动命令如下,替换为你自己的域名即可:

    collidermain -port=8443 -tls-cert=/etc/letsencrypt/live/你的域名/fullchain.pem -tls-key=/etc/letsencrypt/live/你的域名/privkey.pem -room-server=https://你的域名.com
    

    注意必须使用fullchain.pem而非cert.pem,否则会缺少中间证书导致信任报错

  2. 调整证书文件权限
    如果你没有用root身份运行collidermain,需要开放证书目录的读取权限:

    chmod 755 /etc/letsencrypt/live/
    chmod 755 /etc/letsencrypt/archive/
    chmod 644 /etc/letsencrypt/live/你的域名/*
    
  3. 同步更新Turnserver配置
    打开/etc/turnserver.conf,确认以下配置项指向最新证书:

    cert=/etc/letsencrypt/live/你的域名/fullchain.pem
    pkey=/etc/letsencrypt/live/你的域名/privkey.pem
    
  4. 完全重启相关服务
    先杀死残留进程再重启,避免旧进程残留:

    pkill -9 collidermain
    pkill -9 turnserver
    systemctl restart coturn
    # 替换为你实际的collidermain启动命令重新启动服务
    
  5. 验证修复结果
    用curl测试服务是否正常,无SSL报错即为修复成功:

    curl -v https://你的域名:8443
    

    验证通过后即可打开应用测试呼叫功能。

  6. 配置自动续期钩子避免复发
    在/etc/letsencrypt/renewal-hooks/post/目录下新建restart_webrtc.sh脚本,内容如下:

    #!/bin/bash
    pkill -9 collidermain
    # 替换为你实际的collidermain启动命令
    nohup collidermain -port=8443 -tls-cert=/etc/letsencrypt/live/你的域名/fullchain.pem -tls-key=/etc/letsencrypt/live/你的域名/privkey.pem -room-server=https://你的域名.com &
    systemctl restart coturn
    

    给脚本加执行权限:

    chmod +x /etc/letsencrypt/renewal-hooks/post/restart_webrtc.sh
    

    后续certbot自动续期证书后会自动重启相关服务加载新证书,不会再出现同类问题。


内容的提问来源于stack exchange,提问作者Azad Mamun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 05:36:03