这里写自定义目录标题
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并没有。