"Call to SSPI failed" 连接到 OpenSSL 服务器时

"Call to SSPI failed" when connecting to OpenSSL Server

调用 AuthenticateAsClient() 时,我收到错误 "Call to SSPI failed.",内部异常 "The message received was unexpected or badly formatted"。

我发现这是一个不太受欢迎的问题,但我一直没能找到可行的解决方案。这是我搜索文章几个小时后所处的位置:

对于 AuthenticateAsClient() 的主机名参数,我也尝试使用 CA root 的 CN 和客户端证书的 CN,结果相同。

当我使用 openssl s_client connect

连接到它时,我验证了我尝试与之交谈的服务确实工作正常

这里是连接代码:

private void Setup(string hostname, int port, X509Certificate2Collection certs)
{
    try
    {
        // create the socket
        var clientSocket = new TcpClient(hostname, port);
        _sslStream = new SslStream(
            clientSocket.GetStream(),
            false,
            ValidateServerCertificate,
            null);

        _sslStream.AuthenticateAsClient(
            "VirtuCrypt Root CA - Test", // hostname here must match the name on the server certificate
            certs,
            SslProtocols.Tls11,
            false);

        Debug.WriteLine("Connected!");
    }
    catch(Exception ex)
    {
        Debug.WriteLine(ex.Message);

        if(ex.InnerException != null)
            Debug.WriteLine(ex.InnerException.Message);
    }
}

拔掉我的头发……有什么想法吗?

更新: 我启动 Wireshark 并注意到与主机之间的所有通信都是通过 TCP 完成的,其中 none 是通过 TLS 完成的。尽管我正在请求 TLS12

,但不确定这是否是我应该关心的事情

更新 2: 我再次查看 Wireshark 并修复了解码,以便它除了显示 TCP 连接外还显示 TLS 通信。现在我可以看到握手,我可以看到实际上没有提供客户端证书。我正在向 SslStream 提供该证书,所以我不知道为什么它没有被传输。

好吧,在终于与 Wireshark 成为朋友并打破了大约 4 个咖啡杯追着我的尾巴之后,这就是我发现的...

  • 提供给我们的 CA 根目录是一个 pem 文件,实际上包含 CA 根目录和 3 个中间证书。
  • 我不得不将它们分解成单独的文件,并将 CA 根导入到我们受信任的根 CA 存储中,并将 3 个中间证书导入到中间 CA 存储中
  • 我之前没有注意到,但是我们安装在个人商店中的客户端证书说它没有足够的信息来验证,但真正发生的是它没有通过验证,因为我们没有如上所述正确安装 CA 证书。一旦我分别安装了这些,这条消息就消失了
  • 看来 .Net 不会发送您的客户端证书,除非它可以被验证。在我对 OP 的第二次编辑中,我提到我可以看到根本没有发送客户端证书。 这才是真正的问题。一旦我安装了这些 CA 证书,证书就开始发送,其他一切都很好。