C# .NET6 TCP服务器WebSocket SSL认证失败问题求助
WSS连接.NET6 TCP服务器失败:凭证不被识别的解决方法
非安全WebSocket(WS)连接正常,但切换为WSS时,SslStream.AuthenticateAsServer抛出错误:The credentials supplied to the package were not recognized,证书已导入MMC本地计算机存储,管理员运行程序无效。
1. 确保证书通用名称(CN)与连接地址匹配
生成自签名证书时,必须保证证书的CN与客户端连接的地址完全一致(此处为127.0.0.1)。修改OpenSSL脚本,在openssl req步骤添加-subj参数指定CN:
KEY_SIZE=2048 PRIVATE_KEY_FILE='myserver.key' CERTIFICATE_FILE='myserver.crt' PFX_FILE='myserver.pfx' KEY_PASSWORD='my_password' PFX_PASSWORD='my_password' openssl genrsa -des3 -passout pass:$KEY_PASSWORD -out $PRIVATE_KEY_FILE $KEY_SIZE # 添加-subj指定CN为127.0.0.1 openssl req -new -key $PRIVATE_KEY_FILE -out request.csr -passin pass:$KEY_PASSWORD -subj "/CN=127.0.0.1" openssl x509 -req -days 365 -in request.csr -signkey $PRIVATE_KEY_FILE -out $CERTIFICATE_FILE -passin pass:$KEY_PASSWORD openssl pkcs12 -export -out $PFX_FILE -inkey $PRIVATE_KEY_FILE -in $CERTIFICATE_FILE -passin pass:$KEY_PASSWORD -password pass:$PFX_PASSWORD rm request.csr
2. 修复证书私钥的权限问题
Windows下,即使证书导入成功,服务器进程可能没有私钥的读取权限:
- 打开MMC,添加「证书」管理单元,选择「本地计算机」
- 展开「个人」→「证书」,找到目标自签名证书
- 右键证书 → 所有任务 → 管理私钥
- 点击「添加」,输入运行服务器的用户名(如当前登录用户,或
Network Service如果以服务运行) - 给该用户分配「读取」权限,点击确定
3. 正确导入证书到受信任根存储
自签名证书需要导入到「本地计算机」的「受信任的根证书颁发机构」,而非仅存于个人存储:
- 双击
myserver.crt文件,点击「安装证书」 - 选择「本地计算机」,点击下一步
- 选择「将所有证书放入下列存储」,点击「浏览」
- 选择「受信任的根证书颁发机构」,完成导入
4. 调整SslStream认证参数与证书加载选项
证书加载调整
去掉PersistKeySet(避免重复存储密钥引发冲突):
X509Certificate2 serverCertificate = new X509Certificate2("myserver.pfx", "my_password", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable); Console.WriteLine("Private key exists: " + (serverCertificate.HasPrivateKey ? "Yes" : "No")); Console.WriteLine("Certificate valid: " + (serverCertificate.Verify() ? "Yes" : "No"));
SslStream认证参数调整
添加TLS1.3支持,并确认客户端证书要求设置正确:
SslStream sslStream = new SslStream(client.Stream); try { // 支持TLS1.2和TLS1.3,关闭客户端证书要求 sslStream.AuthenticateAsServer(serverCertificate, false, SslProtocols.Tls12 | SslProtocols.Tls13, true); // 后续WebSocket握手逻辑... } catch (AuthenticationException e) { Console.WriteLine($"Exception: {e.Message}"); if (e.InnerException != null) { Console.WriteLine($"Inner exception: {e.InnerException.Message}"); } client.Disconnect(); continue; }
5. 客户端浏览器兼容性处理
自签名证书会被浏览器默认阻止,需手动配置例外:
- 先在浏览器中访问
https://127.0.0.1:20000,手动接受证书并添加例外 - 或在Chrome中启用「允许不安全的localhost」:打开
chrome://flags/#allow-insecure-localhost,设置为启用
内容的提问来源于stack exchange,提问作者the Wongfon Semicolon
相关产品推荐
相关产品推荐

