求助:SIP.js用WSS连接FreeSWITCH失败(WS正常,已换自签证书)
问题描述
使用SIP.js向FreeSWITCH服务器注册时,WS(WebSocket)协议可正常运行,但切换为WSS(WebSocket Secure)协议后出现连接错误,已将原有证书替换为自签名证书wss.pem。
FreeSWITCH错误日志
tport.c:2777 tport_wakeup_pri() tport_wakeup_pri(0x7fe5c800be90): events IN tport.c:867 tport_alloc_secondary() tport_alloc_secondary(0x7fe5c800be90): new secondary tport 0x7fe5c8018990 tport.c:2103 tport_close() tport_close(0x7fe5c8018990): (null)/(null):(null) tport_type_ws.c:641 tport_ws_next_timer() tport_ws_next_timer(0x7fe5c8018990): Error establishing SSL to (null)/(null):(null) tport.c:2278 tport_set_secondary_timer() tport(0x7fe5c8018990): set timer at 0 ms because zap tport.c:2103 tport_close() tport_close(0x7fe5c8018990): (null)/(null):(null) tport_type_ws.c:535 tport_ws_deinit_secondary() 0x7fe5c8018990 destroy wss transport 0x7fe5c8018b80.
SIP.js 相关代码
const transportOptions = { server: "wss://10.16.127.26:7443"//fs }; //ua // const userAgent = new UserAgent({transportOptions}); // userAgent.start(); const fake_uri='sip:'+extName+'@10.16.127.26' const uri = UserAgent.makeURI(fake_uri); const targeturi=UserAgent.makeURI(target); if (!uri) { throw new Error("Failed to create URi"); } const userAgentOptions = { authorizationPassword: '1234', authorizationUsername: '1001', transportOptions, // hackWssInTransport: true, uri, }; const userAgent = new UserAgent(userAgentOptions); connect.addEventListener('click',e=>{ // console.log('ok'); const registerer = new Registerer(userAgent); userAgent.start().then(() => { registerer.register() console.log('11'); }); // console.log( registerer.register()); })
解决方案
1. 检查FreeSWITCH证书配置
确保FreeSWITCH正确加载自签名证书,在vars.xml中确认以下配置:
<X-PRE-PROCESS cmd="set" data="wss-cert-path=/path/to/wss.pem"/> <X-PRE-PROCESS cmd="set" data="wss-key-path=/path/to/wss.key"/>
注意:证书文件权限需设置为600,避免FreeSWITCH无法读取;若证书包含链文件,需合并到wss.pem中。
2. 验证证书有效性
在FreeSWITCH服务器上执行命令检查证书:
openssl x509 -in /path/to/wss.pem -text -noout
确认证书的Subject Alternative Name(SAN)包含服务器IP10.16.127.26,否则会因域名不匹配被拒绝。缺失SAN需重新生成证书:
openssl req -x509 -newkey rsa:4096 -keyout wss.key -out wss.pem -days 365 -addext "subjectAltName=IP:10.16.127.26" -nodes
3. 配置SIP.js忽略自签名证书(测试环境)
自签名证书不受浏览器信任,需在transportOptions中添加TLS配置关闭验证:
const transportOptions = { server: "wss://10.16.127.26:7443", tlsOptions: { rejectUnauthorized: false } };
生产环境请使用CA颁发的合法证书,禁止此配置。
4. 确认WSS端口监听
检查FreeSWITCH配置文件(如sip_profiles/external.xml)是否开启WSS监听:
<param name="wss-binding" value="0.0.0.0:7443"/>
重启FreeSWITCH后,用netstat -tulpn | grep 7443确认端口处于监听状态。
5. 排查网络连通性
确认客户端到FreeSWITCH的7443端口未被防火墙拦截,可通过telnet 10.16.127.26 7443测试连通性。
内容的提问来源于stack exchange,提问作者cqupt_zz
相关产品推荐
相关产品推荐

