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

这里写自定义目录标题

  • C#使用证书与服务端建立SSL/TLS通信,验证失败
    • 问题描述
    • 框架环境
    • 分析原因及解决方案

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并没有。

你可能感兴趣的:(c#,ssl,openssl,tls,c#,socket)