客户端证书 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 服务调用的主要内容,如果未能解决你的问题,请参考以下文章
使用ssl和客户端证书的Wcf:请求svc succes wcf调用返回403.16
Spring Boot - 调用另一个需要证书的 Web 服务
iPhone Web 服务通过证书身份验证调用 WCF 服务