使用WebSocketSharp建立C#/Unity WSS连接的问题求助
场景概述
在C#控制台应用和Unity中使用WebSocketSharp-core库实现WSS连接时,遇到两类问题:控制台客户端连接后立即关闭,Unity服务器启动报"HMAC is not supported"错误,而WS连接均正常工作。环境包含Windows系统、DuckDNS域名、Let's Encrypt SSL证书。
问题1:控制台应用WSS连接立即关闭的原因及解决
可能原因
- PFX证书转换不规范,未包含完整信任链
- 证书域名与客户端连接的域名不匹配
- SSL协议版本未明确指定,导致协商失败
- 服务器SSL配置缺失关键项
解决步骤
重新生成PFX证书
不要合并fullchain和privkey为combined.pem,直接用以下OpenSSL命令生成PFX,确保包含完整证书链和私钥:openssl pkcs12 -export -out certificate.pfx -inkey privkey.pem -in fullchain.pem输入密码后完成转换,确保证书的CN或SAN字段与
abyza.duckdns.org完全匹配。调整服务器SSL配置
在服务器代码中添加TLS版本指定,并关闭证书吊销检查(测试阶段):var wssv = new WebSocketServer(System.Net.IPAddress.Any, 50001, true); var cert = new X509Certificate2("path/to/certificate.pfx", "your-password"); wssv.SslConfiguration.ServerCertificate = cert; // 指定支持的TLS版本 wssv.SslConfiguration.EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12 | System.Security.Authentication.SslProtocols.Tls13; // 测试时关闭吊销检查 wssv.SslConfiguration.CheckCertificateRevocation = false;注意修正服务器启动提示的端口(代码中写的是443,实际用的是50001)。
客户端临时添加证书验证回调
测试阶段可跳过证书验证确认连接问题,正式环境需移除:using (var ws = new WebSocket("wss://abyza.duckdns.org:50001/Echo")) { ws.SslConfiguration.ServerCertificateValidationCallback = (sender, cert, chain, errors) => true; // 其他事件绑定... ws.Connect(); }
问题2:Unity中"HMAC is not supported"错误解决
原因
WebSocketSharp-core是精简版,在Unity的Mono运行时中缺少部分加密算法支持,Bouncy Castle集成方式不正确。
解决步骤
替换为完整版WebSocketSharp
移除websocket-sharp-core,改用NuGet上的原版WebSocketSharp(非core版本),完整版包含更完整的加密实现。正确集成Bouncy Castle
- 下载Unity兼容的
BouncyCastle.Crypto.dll放入Unity项目的Plugins文件夹。 - 在服务器启动前注册Bouncy Castle加密提供者:
using Org.BouncyCastle.Security; void StartServer() { // 注册Bouncy Castle作为加密提供者 SecurityUtilities.AddProvider(new BouncyCastleProvider()); // 后续服务器初始化代码... }
- 下载Unity兼容的
切换Unity脚本运行时
打开Unity项目设置:Edit > Project Settings > Player > Other Settings > Configuration,将Scripting Runtime Version切换为.NET 4.x Equivalent或更高版本,新版本运行时对加密算法支持更完善。
问题3:WebSocketSharp搭建WSS的遗漏配置步骤
- 证书完整性检查:必须使用
fullchain.pem生成PFX,确保包含服务器证书和所有中间证书,否则客户端无法验证信任链。 - SSL协议版本指定:显式启用TLS1.2/TLS1.3,避免使用过时的SSLv3/TLS1.0协议,提升兼容性和安全性。
- 端口与防火墙配置:确认路由器已转发50001端口的TCP流量,Windows防火墙允许该端口入站/出站。
- 域名解析验证:确保DuckDNS域名正确解析到服务器公网IP,可通过
ping abyza.duckdns.org验证。 - 正式环境证书验证:客户端不要跳过证书验证,确保证书域名匹配、信任链完整,避免安全风险。
内容的提问来源于stack exchange,提问作者ABYZA

