C#应用通过WSS连接Node.js服务器触发PlatformNotSupportedException
解决C# WebSocket连接Node.js WSS服务器时的System.PlatformNotSupportedException异常
看起来你碰到的问题主要是两个核心点:自签名证书的信任问题和SSL协议版本不匹配,咱们一步步来拆解解决:
1. 先搞定自签名证书的信任问题
你的Node.js服务器用的是自己生成的证书(cert.pem/key.pem),这类自签名证书不在系统默认的信任根列表里。Chrome扩展和前端JS能正常连接,大概率是你之前在浏览器里手动信任过这个证书,或者浏览器允许临时跳过验证,但C#的WebSocket客户端(包括websocket4net)对SSL证书的验证要严格得多,这很可能是触发异常的首要原因。
解决方案(二选一):
- 测试/开发环境:直接禁用证书验证(仅限开发用,生产环境绝对不能这么做):
_socket = new WebSocket("wss://127.0.0.1:8080"); // 跳过证书验证 _socket.SslConfiguration.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true; - 生产/正式测试环境:把你的自签名证书导入到C#应用运行机器的受信任根证书颁发机构存储中,导入后客户端就会信任这个证书了。
2. 强制指定SSL协议版本为TLS 1.2
你提到连接wss://echo.websocket.org时必须设置Tls12才能成功,说明你的C#客户端默认的SSL协议版本可能偏低(比如TLS 1.0/1.1),而Node.js的新版本默认会禁用这些旧协议,只支持TLS 1.2及以上。
解决方案:
在websocket4net的客户端配置里明确指定SSL协议版本:
_socket.SslConfiguration.EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12;
3. 整合后的完整C#代码
把上面两个配置结合起来,你的客户端初始化代码应该改成这样:
_socket = new WebSocket("wss://127.0.0.1:8080"); _id = Guid.NewGuid().ToString(); // 关键配置:指定SSL协议为TLS 1.2 _socket.SslConfiguration.EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12; // 关键配置:跳过自签名证书验证(开发用) _socket.SslConfiguration.ServerCertificateValidationCallback = (sender, cert, chain, errors) => true; _socket.OnOpen += (sender, e) => { Console.WriteLine("WebSocket Connection is now Open with ID: " + _id); }; _socket.OnMessage += (sender, e) => { Console.WriteLine("On Message"); Console.WriteLine(e.Data); }; _socket.Connect();
4. 可选:给Node.js服务器明确指定SSL协议版本
为了确保两端协议完全匹配,你也可以在Node.js的HTTPS配置里强制要求TLS 1.2:
var https = require("https").createServer({ cert: fs.readFileSync(__dirname + "/certs/cert.pem"), key: fs.readFileSync(__dirname + "/certs/key.pem"), minVersion: 'TLSv1.2' // 明确最低支持TLS 1.2 }, app)
这样调整之后,你的C#客户端应该就能像连接echo服务器一样顺利连上自己的Node.js WSS服务器了。
内容的提问来源于stack exchange,提问作者Skunz
相关产品推荐
相关产品推荐

