【发布时间】:2016-05-28 10:38:34
【问题描述】:
调用 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()的主机名参数,我也尝试过使用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,但不确定这是否是我应该关心的事情
更新2: 我再次查看 Wireshark 并修复了解码,以便它显示除 TCP 连接之外的 TLS 通信。现在我可以看到握手,我可以看到实际上没有提供任何客户端证书。我将该证书提供给 SslStream,所以我不知道为什么它没有被传输。
【问题讨论】:
标签: c# .net ssl openssl sslstream