连接到 OpenSSL 服务器时“调用 SSPI 失败”

本文关键字:调用 SSPI 失败 OpenSSL 服务器 连接 | 更新日期: 2023-09-27 18:35:06

调用AuthenticateAsClient()时,我收到错误"调用SSPI失败",内部例外"收到的消息是意外的或格式不正确"。

我已经看到这是一个半流行的问题,但我无法找到可行的解决方案。这是我在搜索文章几个小时后所处的位置:

  • 服务器使用我的私钥向我颁发了签名的客户端证书
  • 使用
  • 开放的SSL,我将两者合并为一个pfx,使用:

    openssl pkcs12 -in My-Client-Cert.pem -inkey ssl-client-privatekey.pem -export -out private-key-pair.pfx

  • 我将证书导入到本地计算机上的个人文件夹中。我能够看到证书识别出存在私钥。
  • 私钥不受密码保护
  • 我将正在与之通信的服务的 CA 根导入到我的受信任根证书颁发机构和个人存储中。
  • 在应用程序代码中,我通过缩略图拉取证书。我可以在调试器中看到私钥和公钥都存在。
  • 我初始化一个 Tcp客户端
  • 然后,我使用 TcpClient 初始化一个 SslStream
  • 我调用 AuthenticateAsClient()
  • 我收到错误消息

对于 AuthenticateAsClient() 的主机名参数,我还尝试使用 CA 根的 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完成的,而没有一个是通过TLS完成的。不确定这是否是我应该关注的事情,尽管我正在请求 TLS12

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

连接到 OpenSSL 服务器时“调用 SSPI 失败”

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

  • 提供给我们的 CA 根是一个 pem 文件,实际上包括 CA 根和 3 个中间证书。
  • 我必须将它们分解为单独的文件,并将 CA 根导入我们受信任的根 CA 存储,并将 3 个中间证书导入中间 CA 存储
  • 我以前没有注意到,但是安装在个人存储中的客户端证书说它没有足够的信息进行验证,但真正发生的事情是它验证失败,因为我们没有如上所述正确安装 CA 证书。一旦我单独安装了它们,这条消息就消失了
  • 除非可以验证客户端证书,否则 .Net 似乎不会发送客户端证书。在 OP 的第二次编辑中,我提到我可以看到客户端证书根本没有发送。这是实际问题。一旦我安装了这些 CA 证书,证书就开始发送,其他一切都很好。