最近有个项目要调用客户用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 这个工具,下载地址:http://www.microsoft.com/en-us/download/details.aspx?id=19801

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这个工具给指定账户授予使用证书的权限,就可以正常调用啦!

彻底解决:请求被中止: 未能创建 SSL/TLS 安全通道的更多相关文章

  1. C# 解决“请求被中止: 未能创建 SSL/TLS 安全通道”的问题

    最近在开发项目的时候,使用爬虫抓取网络数据的时候,当请求Web数据时,碰到了“请求被中止: 未能创建 SSL/TLS 安全通道”的问题,尝试过很多网上的方法,例如添加证书等都没有用.最后在GitHub ...

  2. 请求被中止: 未能创建 SSL/TLS 安全通道,以及解决方法,即:Could not create SSL/TLS secure channel

    C# 访问https请求被中止: 未能创建 SSL/TLS 安全通道(Could not create SSL/TLS secure channel) 以及 X509Certificate2 temp ...

  3. .NET HttpWebRequest(请求被中止: 未能创建 SSL/TLS 安全通道)和(基础连接已经关闭: 发送时发生错误)问题查找解决

    前言: 前段时间在对接第三方接口的时候发生了一个非常奇葩的问题,就是使用 .NET Framework 4.6 HttpWebRequest进行网络请求的相关问题.背景,关于调用第三方的接口都是使用使 ...

  4. C# 请求被中止: 未能创建 SSL/TLS 安全通道。 设置SecurityProtocol无效

    今天为了获取一张图片,用了一段代码: ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateV ...

  5. 请求被中止: 未能创建 SSL/TLS 安全通道

    出现“请求被中止: 未能创建 SSL/TLS 安全通道.”的问题. 在创建请求地址的前面加了这句代码就可以了 System.Net.ServicePointManager.SecurityProtoc ...

  6. 请求被中止: 未能创建 SSL/TLS 安全通道,设置 TLSv1.2和TLSv1.1版本 .基础链接已经关闭,发送时发生错误

    WSO2 API访问的安全要求, 只能提供TLSv1.2和TLSv1.1版本,其它SSL版本协议因为存在较高安全漏洞问题会被disable. A 改成TLSv1.1或TLSv1.2,最好使用TLSv1 ...

  7. Paypal开发中遇到请求被中止: 未能创建 SSL/TLS 安全通道及解决方案

    最近在基于ASP.NET上开发了Paypal支付平台,在ASP.NET开发的过程中没有遇到这个问题,但是引用到MVC开发模式中的时候就出现了"未能创建 SSL/TLS 安全通道及解决方案&q ...

  8. WebRequest请求被中止: 未能创建 SSL/TLS 安全通道

    使用System.Net.WebRequest.Create(url)抓取某网站信息时 ,出现“未能创建 SSL/TLS 安全通道”此条异常信息 解决方案 引用:using System.Net; 在 ...

  9. C# https证书通信Post/Get(解决做ssl通道时遇到“请求被中止: 未能创建 SSL/TLS 安全通道”问题)

    public static string HttpPost(string url, string param = null) { HttpWebRequest request; //如果是发送HTTP ...

随机推荐

  1. PHPstrom2016.1激活与汉化【2016.06.21依旧可用】

    : 目前的网络上有很多的关于PHPstrom激活的方法,但是很多都失效了,没有具体的使用日期,这个是我从其他网友那里转载过来的,具体地址忘记了: 方法如下: 需要在联网条件下,打开PHPstrom,在 ...

  2. CGAL Manual/tutorial_hello_world.html

    Hello World Author CGAL Editorial Board 本教程是为知道C++和几何算法的基本知识的CGAL新手准备的.第一节展示了如何特化点和段CGAL类,以及如何应用几何谓词 ...

  3. c# 判断窗体是否永在最前(TopMost),调用windows API

    许多程序都可以把自身的窗体设为最前显示状态,这个可以参考博客c#让窗体永在最前 调用windows api 将窗体设为topmost.那么如何判断桌面上的一个窗体是否为最前显示状态呢,不光是自己的程序 ...

  4. 2014年度辛星css教程夏季版第一节

    CSS是Cascading Style Sheets的缩写,即层叠样式表,它用于表现HTML的样式,即HTML只是去写该网页有哪些内容,至于如何去表现它们,由CSS去定制. ************* ...

  5. Linux下STM32开发环境的搭建

    目录 一.概述 1.目的 2.开发环境描述 3.Eclipse构建的STM32集成开发环境结构 4.GDB / GDB Server 调试模型 二.搭建步骤 三.详细的搭建过程 1.安装eclipse ...

  6. joda jar日期处理类的学习

    转载:http://www.open-open.com/lib/view/open1348032952724.html 任何企业应用程序都需要处理时间问题.应用程序需要知道当前的时间点和下一个时间点, ...

  7. 【经验】angularjs 实现带查找筛选功能的select下拉框

    一.背景 对于select的下拉列表,像国家选择这样的功能,全世界那么多国家,一直拉滚动条多辛苦,眼睛也要盯着找,累!so,为优化用户体验,带查找功能的下拉框是非常非常有必要的.都知道jquery里有 ...

  8. DataGridView自动行号

    最近又用了一下DataGridView控件,需要显示行号,我们知道在.net中DataGridView控件默认是不显示行号(数据的记录行数)的,后来通过查资料发现可以在DataGridView控件的R ...

  9. fatal error C1853

    http://myswirl.blog.163.com/blog/static/513186422011827105224739/ 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C ...

  10. Logback 将日志分级别打印

    最近项目中用到了logback 记录日志,  关于为啥使用logback 请百度一下:  logback与Log4J的区别 好了,废话不多说,直奔主题, 研究了好久,终于将日志按级别将日志分文件打印出 ...