加入房间时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证书加载异常导致握手失败,具体可分为以下几类常见情况:
- collidermain启动参数配置的证书路径错误,或只配置了
cert.pem未配置fullchain.pem,缺少证书信任链导致客户端判定证书未知 - 证书文件权限不足,collidermain运行身份无权限读取Let's Encrypt生成的证书文件
- Turnserver配置文件中绑定的仍是旧证书,和新换的证书不匹配
- 重启服务时未完全杀死旧的collidermain进程,旧进程仍加载旧证书对外提供服务
- 开启了certbot自动续期但未配置续期后重启钩子,证书自动更新后相关服务未加载新证书
修正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,否则会缺少中间证书导致信任报错调整证书文件权限
如果你没有用root身份运行collidermain,需要开放证书目录的读取权限:chmod 755 /etc/letsencrypt/live/ chmod 755 /etc/letsencrypt/archive/ chmod 644 /etc/letsencrypt/live/你的域名/*同步更新Turnserver配置
打开/etc/turnserver.conf,确认以下配置项指向最新证书:cert=/etc/letsencrypt/live/你的域名/fullchain.pem pkey=/etc/letsencrypt/live/你的域名/privkey.pem完全重启相关服务
先杀死残留进程再重启,避免旧进程残留:pkill -9 collidermain pkill -9 turnserver systemctl restart coturn # 替换为你实际的collidermain启动命令重新启动服务验证修复结果
用curl测试服务是否正常,无SSL报错即为修复成功:curl -v https://你的域名:8443验证通过后即可打开应用测试呼叫功能。
配置自动续期钩子避免复发
在/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

