博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
彻底解决:请求被中止: 未能创建 SSL/TLS 安全通道
阅读量:6224 次
发布时间:2019-06-21

本文共 2313 字,大约阅读时间需要 7 分钟。

最近有个项目要调用客户用java写的带https的webservice,对方提供了证书文件 test.pfx,我这里调用方式如下:

//webservice代理类SvcService svc = new SvcService();//证书文件路径string filePath = ConfigurationManager.AppSettings["pfxUrl"];X509Certificate cert = new System.Security.Cryptography.X509Certificates.X509Certificate(filePath, "123456");//将证书添加客户端证书集合svc.ClientCertificates.Add(cert);//webservice调用代码...

测试调用报错:请求被中止: 未能创建 SSL/TLS 安全通道,于是赶紧google,找到如下解决方案:

在webservice代理类的构造函数中添加下面的代码,绕过服务器证书验证。

public static bool CheckValidationResult(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, X509Chain chain, SslPolicyErrors errors){        return true;}        public SvcService() {    ServicePointManager.Expect100Continue = true;    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);                this.Url = ConfigurationManager.AppSettings["host"];}

本地vs环境下再试,好了!调用成功!不报错了!于是赶紧发布到IIS服务器上试一下,郁闷的是服务器上居然报错,还是这个未能创建 SSL/TLS 安全通道!

于是继续google,找到下面的解决方法:

1.将客户端证书文件导入到本地计算机账户下的个人存储区。

2.下载winhttpcertcfg.exe 这个工具,下载地址:

3.安装后一般是在C:\Program Files\Windows Resource Kits\Tools这个路径下面。 进入cmd 执行如下命令:winhttpcertcfg -g -c LOCAL_MACHINE\MY -s "test" -a "NetworkService"

这里解释一下这几个参数的含义:

-g 是grant授权的意思,将该证书的使用权限授予某个用户

-c 是certstore证书存储区,指定 本地计算机/当前用户下的证书存储区位置,我们这里是MY,个人存储区

-s 是subjectstr 用于模糊匹配证书的一个字符串,我们这里用证书文件名 test

-a 是account要授权的用户帐号

这里要注意的是授权账户,IIS6下面一般用的是NetworkService,如果你用的IIS7,必须要保证你网站所用的应用程序池的 "标识"和要授权的账户一致。

执行成功之后,会列出模糊匹配出的证书列表和已经授权的账户。

然后程序代码做如下更改:

//webservice客户端代理类SvcService svc = new SvcService();//打开本地计算机下的个人证书存储区X509Store certStore = new System.Security.Cryptography.X509Certificates.X509Store(StoreName.My, StoreLocation.LocalMachine);certStore.Open(OpenFlags.ReadOnly);//根据名称查找匹配的证书集合,这里注意最后一个参数,传true的话会找不到X509Certificate2Collection certCollection = certStore.Certificates.Find(System.Security.Cryptography.X509Certificates.X509FindType.FindBySubjectName, "test", false);//将证书添加至客户端证书集合svc.ClientCertificates.Add(certCollection[0]);//webservice调用代码

再测试了一下,调用正常!至此这个问题算圆满解决了!

总结:我们导入的客户端证书并不是所有的账户都能访问和使用,因为我们的开发服务器也就是VS自带的服务器默认使用当前用户,而当前用户具有使用证书的权限,所以我们在本地调试的时候,一切正常。当我们将网站部署到IIS后,由于IIS的使用的是内置账户不具有证书的使用权限,所以就出现了上述问题,这个时候我们只需用winhttpcertcfg这个工具给指定账户授予使用证书的权限,就可以正常调用啦!

转载地址:http://nquna.baihongyu.com/

你可能感兴趣的文章
融入欧洲产业链 华为在数学上投注希望
查看>>
中国实现城域量子隐形传态为全球量子网络打基础
查看>>
超算入云
查看>>
沃达丰完成5G毫微波测试 室外单用户速率达到20Gbps
查看>>
Facebook宣布支持在Android上使用Tor访问
查看>>
即便背靠微信,微信企业号累积 2000 万用户也用了近两年时间
查看>>
MuleSoft发布新的Anypoint Platform,用户可操控API
查看>>
牙疼怎么快速止痛,三招解决牙痛立竿见影
查看>>
大数据云计算悄然改变服务器市场格局 英特尔霸主地位受IBM、ARM威胁
查看>>
英利宣布退出欧盟限价限协议
查看>>
深圳运用大数据推动"智慧司法"
查看>>
Windows 10免费升级服务终成历史 说说我们和它的恩怨
查看>>
苹果为何在中国一南一北设两个研发中心?五重考量
查看>>
Three UK遭黑客入侵 600万用户的个人信息存在被窃危险
查看>>
自动驾驶应有传感器冗余
查看>>
超融合产业需要这种“情怀”
查看>>
11-3URLTestDemo实例操作完成URL单元测试
查看>>
使用大数据,就像在沙子里淘金
查看>>
敏捷测试理论以及实践(4)
查看>>
Windows 10新版15058推送:RS2准正式、无水印
查看>>