C# SSL/TLS - 提示错误:“调用 SSPI 失败,请参见内部异常。”

C#使用证书与服务端建立SSL/TLS通信,验证失败

遇到一个问题挺特殊的,记录一下。

问题描述

C#做客户端使用TcpClient+SslStream建立SSL/TLS通信时,在调用SslStream.AuthenticateAsClient方法验证证书时发生异常。

异常信息:

调用 SSPI 失败,请参见内部异常。
接收到的消息异常,或格式不正确。
A call to SSPI failed, see inner exception.
The message received was unexpected or badly formatted

框架环境

同样的一套用于建立SSL连接的C#代码,之前在 .NET Core/.NET 5 环境下没有问题,但后来在 .NET Framework和.NET Standard 上运行时就产生了上述问题。
经过反复测试,发现问题确实只存在于.NET Framework和.NET Standard平台。

分析原因及解决方案

其实最终并没有真正解决这个问题,因为客户端上没有进行改动,反而是修改了服务端的代码。
服务端是用**C++**开发的,引用 OpenSSL库实现的,在配置服务端验证规则的时候关注到有一个参数 :

SSL_VERIFY_FAIL_IF_NO_PEER_CERT

意思如果服务端会向客户端要证书,如果客户端没有返回证书,则验证失败。
但是我翻遍了微软官方的文档,没有找到 SslStream 有关于返回客户端证书相关的方法,所以只能取消了这部分的验证。于是,连接就成功了。

推测是.NET Core在SSL通信的底层实现了返回客户端证书的操作,而.NET Framework和.NET Standard并没有。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
这个异常通常是由于SSL/TLS连接配置不正确引起的。要解决这个问题,你可以尝试以下几个步骤: 1. 确保你的MySQL服务器启用了SSL/TLS连接。你可以在MySQL服务器的配置文件中设置`ssl-mode`参数为`REQUIRED`或`ENABLED`,以确保只允许SSL/TLS连接。 2. 确保你的应用程序使用正确的SSL/TLS连接选项。在连接MySQL数据库之前,设置`SslMode`属性为`Required`或`Preferred`,以指示应用程序要求使用SSL/TLS连接。 ```vb Using connection As New MySqlConnection(connectionString) connection.SslMode = MySqlSslMode.Required ' 其他连接设置... Try ' 连接和查询代码... Catch ex As Exception ' 异常处理代码... Finally ' 关闭连接代码... End Try End Using ``` 3. 如果你使用的是自签名证书或不受信任的证书,确保在应用程序中正确配置证书验证。你可以使用`CertificateFile`和`CertificatePassword`属性来指定证书文件和密码。 ```vb Using connection As New MySqlConnection(connectionString) connection.SslMode = MySqlSslMode.Required connection.CertificateFile = "path/to/certificate.pem" connection.CertificatePassword = "password" ' 其他连接设置... Try ' 连接和查询代码... Catch ex As Exception ' 异常处理代码... Finally ' 关闭连接代码... End Try End Using ``` 注意,上述示例中的`connectionString`变量需要替换为你的实际连接字符串。如果问题仍然存在,你可能需要检查你的SSL/TLS证书和配置是否正确,并确保与MySQL服务器使用相同的证书和协议版本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿长大人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值