You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:40:52