客户端证书 Web 服务调用

Posted

技术标签:

【中文标题】客户端证书 Web 服务调用【英文标题】:Client Certificate Web Service Call 【发布时间】:2015-06-12 12:31:42 【问题描述】:

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

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

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

我用谷歌搜索并没有发现如何安装 .crt 客户端证书。还尝试在第 4 步解释 here 进行安装。

当我这样打电话时

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[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) 在 System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest) 在 System.Net.Security.SslState。 CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest) 在 System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResultlazyResult) 在 System.Net.TlsStream.CallProcessAuthentication(Object state) 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 在System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback 回调, 对象状态, Boolean preserveSy ncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result) at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32大小)在 System.Net.PooledStream.Write(字节 [] 缓冲区,Int32 偏移量,Int32 大小)在 System.Net.ConnectStream.WriteHeaders(布尔异步) 在 System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(WebRequest request) 在 System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(WebRequest request) 在 System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[ ] 参数)在.....

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

【问题讨论】:

【参考方案1】:

错误清楚地提到“握手失败”。我怀疑这是由于 WSDL 格式不匹配而导致的 SSL 身份验证错误。

您应该检查您的请求格式和响应的格式是否相同。他们需要匹配才能进行交流。

Microsoft Network Monitor 可以帮助您找出格式。

【讨论】:

以上是关于客户端证书 Web 服务调用的主要内容,如果未能解决你的问题,请参考以下文章

Web服务提供者和消费者之间的证书机制

使用ssl和客户端证书的Wcf:请求svc succes wcf调用返回403.16

Spring Boot - 调用另一个需要证书的 Web 服务

iPhone Web 服务通过证书身份验证调用 WCF 服务

SSLHandshakeException - 使用自签名证书从 Web 应用程序调用 Web 服务

如何使用证书在 Spring Boot 中调用 https Web 服务