连接到OpenSSL服务器时,“呼叫SSPI失败”

时间:2016-02-16 22:54:31

标签: c# .net ssl openssl sslstream

调用AuthenticateAsClient()时,收到错误“呼叫SSPI失败”。内部异常“收到的消息是意外的或格式错误的。”

我已经看到这是一个半流行的问题,但我找不到一个有效的解决方案。这是我在搜索文章几个小时之后的所在:

  • 使用我的私钥,服务器向我发出了签名的客户端证书
  • 使用open ssl,我将两者组合成一个pfx:

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

  • 我将证书导入到LocalMachine上的个人文件夹中。我能够看到证书确认私钥 存在。
  • 私钥未受密码保护
  • 我将我正在谈论的服务的CA Root导入我的受信任的根证书颁发机构和个人商店。
  • 在应用程序代码中,我通过缩略图提取证书。我可以在调试器中看到私钥和公钥都存在。
  • 我初始化一个TcpClient
  • 然后我使用TcpClient
  • 初始化SslStream
  • 我称之为AuthenticateAsClient()
  • 我收到错误消息

对于AuthenticateAsClient()的hostname参数,我还尝试使用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提供该证书,所以我不知道为什么它没有被传输。

1 个答案:

答案 0 :(得分:1)

好的,最后我和Wireshark成了朋友,打破了4个咖啡杯,追逐着我的尾巴,这就是我发现的......

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