客户端证书 Web 服务调用

客户端证书 Web 服务调用

我需要使用客户端证书调用服务器 Web 服务。他们为我提供了一个 .crt 文件。我的项目托管在 WindowsServer2008 IIS7 中。

我通过右键单击属性安装 .crt,因为我无法通过“完成证书请求”将证书添加到服务器证书。我收到错误:

CertEnroll::CX509Enrollment::p_InstallResponse: ANSI bad tag value met.

我在 Google 上搜索,没有找到关于如何安装 .crt 客户端证书的信息。还尝试按照说明进行安装这里在步骤4

当我这样打电话的时候

string certPath = Server.MapPath("../certificate/iot01.servername.crt");
X509Certificate2 cert = new X509Certificate2(certPath);
ws.ClientCertificates.Add(cert);
res = ws.methodName(params);

我收到错误:System.IO.IOException:由于意外的数据包格式,握手失败。在 System.Net.Security.SslState.StartReadFrame(Byte[] 缓冲区,Int32 readBytes,AsyncProtocolRequest asyncRequest) 在 System.Net.Security.SslState.StartReceiveBlob(Byte[] 缓冲区,AsyncProtocolRequest asyncRequest) 在 System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken 消息,AsyncProtocolRequest asyncRequest) 在 System.Net.Security.SslState.StartSendBlob(Byte[] 传入,Int32 计数,AsyncProtocolRequest asyncRequest) 在 System.Net.Security.SslState.ForceAuthentication(Boolean acceptFirst,Byte[] 缓冲区,AsyncProtocolRequest asyncRequest) 在 System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult) 在 System.Net.TlsStream.CallProcessAuthentication(对象状态) 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext执行上下文,ContextCallback 回调,对象状态,布尔值preserveSyncCtx)在System.Threading.ExecutionContext.Run(执行上下文执行上下文,ContextCallback 回调,对象状态,布尔值preserveSyncCtx)在System.Threading.ExecutionContext.Run(执行上下文执行上下文,ContextCallback 回调,对象状态)在System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult 结果)在System.Net.TlsStream.Write(Byte[] 缓冲区,Int32 偏移量,Int32 大小)在System.Net.PooledStream.Write(Byte[] 缓冲区,Int32 偏移量,Int32 大小)在System.Net.ConnectStream.WriteHeaders(布尔异步)在System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(WebRequest 请求)在System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(WebRequest 请求)在System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName,Object[] 参数)在.....

这是否与我的证书安装和调用有关。有人能指出我哪里出错了吗?

答案1

我相信这与你的使命有关:你应该遵循的步骤。

作为一种强力方法来找到问题的关键,请执行以下操作:

使用完全不同的新项目来创建代码,仅使用您引用的链接中的步骤(此处)来测试有关服务器身份验证的部分。这将使您不会与其他可能妨碍您的调试能力的问题捆绑在一起。

不过,作为快速检查,

第一次尝试 确保使用 EXPLICIT TLS 连接来查看是否不需要 TLS,而是使用 SSL:

检查连接对象中启动 TLS 的任何方法 http://www.limilabs.com/blog/the-handshake-failed-due-to-an-unexpected-packet-format

client.Connect("mail.example.com"); 
client.StartTLS(); 

或者尝试一下 https://social.msdn.microsoft.com/Forums/en-US/e8807c4c-72b6-4254-ae64-45c2743b181e/ssltls-the-handshake-failed-due-to-an-unexpected-packet-format-mercury-for-win32-pop3?forum=ncl

您的日志中似乎有四次运行(进程 5068、3984、1628 和 7124)?后三个运行正常吗?您做了什么更改吗?

至少对于 5068,你在发送 STLS 命令后读取响应,但你不是读取服务器的初始“我还活着”行。参见维基百科中的示例:

S:C:S:+OK POP3 服务器就绪 <[电子邮件保护]>

所以你需要读一下这句话,您发送了 STLS 命令。您可以在 5068 中看到,SslStream 获得了 +OK B[egin SSL...] 响应,而不是 SSL 响应。

稍后:我现在明白发生了什么。在其他三次运行中,stream.Read 操作正在读取两个响应行!所以它是否有效只是运气问题。

例如,我在之前的示例中没有打印两行,而是打印了我现在看到的两行:

D:\Temp>SslStartTest.exe -client2 localhost 110 resp: +OK <[电子邮件保护]>,POP3 服务器就绪。响应:+OK 开始 SSL/TLS 协商... HandleLocalCertificateSelectionCallback HandleRemoteCertificateValidationCallback SslPolicyErrors:RemoteCertificateNameMismatch,RemoteCertificateChainErrors TLS 会话已连接。:-) 密码:TripleDes 强度 168 哈希:Sha1 强度 160 密钥交换:RsaSign 强度 1024 协议:Tls 是否作为服务器进行身份验证:True?False IsSigned:True 是否加密:True 证书吊销列表已检查:False 本地证书为空。远程证书颁发给 CN=alanjmcf.example.com,有效期从 03/04/2009 1 0:47:40 到 29/03/2029 10:47:40。可以读取:True,写入 True 可以超时:True ^C

相关内容