[C#]用HttpWebRequest加载证书建立SSL通道时发生异常的解决办法
编写者:郑昀@UltraPower |
关键字:HttpWebRequest, SSL,X509Certificate |
dotNet Framwork 1.1 |
编写时间:2005-3-29 |
WSE 2.0 SP3 |
目的:
对于用HttpWebRequest加载证书请求远端https服务器时,发生的
“基础连接已经关闭: 无法与远程服务器建立信任关系。”/
“The underlying connection was closed. Could not establish a secure SSL/TLS connection”错误,我们可以用如下方式解决。
重现:
使用以下代码,你就可以得到这个错误“基础连接已经关闭: 无法与远程服务器建立信任关系”:
using System; using System.Text; using System.Net; using System.IO; using System.Security.Cryptography.X509Certificates; using Microsoft.Web.Services2.Security; using Microsoft.Web.Services2.Security.Tokens; using Microsoft.Web.Services2.Security.X509; static void Main(string[] args) { StringBuilder sb=new StringBuilder(); string _strToRequest = "send"; try { //POST请求开始 byte[] bt=Encoding.Default.GetBytes("send"); HttpWebRequest Req=(HttpWebRequest)System.Net.WebRequest.Create("https://202.108.CCC.XXX:Port//"); Req.KeepAlive=true; //Req.Timeout=60000; Req.ContentType="text/xml"; Req.ContentLength=_strToRequest.Length; Req.Method="POST"; X509CertificateStore store = X509CertificateStore.CurrentUserStore( X509CertificateStore.MyStore ); store.OpenRead(); //读取证书的keyid Microsoft.Web.Services2.Security.X509.X509CertificateCollection certs = store.FindCertificateByKeyIdentifier( Convert.FromBase64String( "CXv+xZ78zI3qWHGJ6Wh9BF6B23A=" ) ); X509SecurityToken token = null; if (certs.Count > 0) { // 得到证书存储区的第1个人证书 token = new X509SecurityToken( ((Microsoft.Web.Services2.Security.X509.X509Certificate) certs[0]) ); } if(token != null) Req.ClientCertificates.Add(token.Certificate); Req.KeepAlive=true; Stream ReqStream=Req.GetRequestStream(); ReqStream.Write(bt,0,bt.Length); ReqStream.Close(); //得到响应 HttpWebResponse res=(HttpWebResponse)Req.GetResponse(); StreamReader sr=newStreamReader(res.GetResponseStream(),Encoding.Default); sb.Append(sr.ReadToEnd()); res.Close(); sr.Close(); } catch(Exception ex) { sb.Remove(0,sb.Length); sb.Append("<?xml version=\"1.0\" encoding=\"gb2312\"?>\n"); sb.Append("<slia ver=\"1.0.0\">\n"); sb.Append("<result resid=\"501\">"+ex.Message+"</result>\n"); sb.Append("</slia>\n"); } Console.WriteLine(sb.ToString()); Console.Read(); } |
原因:
在“http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconhostingremoteobjectsininternetinformationservicesiis.asp”提到:
“
证书标识特定的计算机,该计算机的名称位于证书的公共名称中。但是,很容易就会更改计算机的名称或使用客户端配置文件中的“localhost”,这会在客户端和服务器证书中的公共名称之间造成不匹配的情况。在 .NET Framework 1.0 版中,这一不匹配的情况将被忽略,并且将在服务器上引发调用。
从 .NET Framework 1.1 版开始,这一不匹配的情况会引发以下异常:“System.Net.WebException:基础连接已经关闭:无法与远程服务器建立信任关系”。如果您无法配置远程处理客户端以使用证书公共名称,则可以使用客户端应用程序配置文件中的以下设置重写这一不匹配的情况。
<system.net>
<settings>
<servicePointManager
checkCertificateName="true"
/>
</settings>
</system.net>
若要以编程方式使客户端忽略证书名称不匹配,客户端必须创建一个特定类的实例,如果 certificateProblem值为 0x800c010f,该类将实现 ICertificatePolicy 接口并实现 CheckValidationResult 方法以返回true。然后,您必须将该对象注册到 System.Net.ServicePointManager 对象,方法是将该对象传递到ServicePointManager.CertificatePolicy 属性。”
解决之道:
但是用它列出的代码还是不对,我们改为CheckValidationResult无条件返回true即可。如下所示声明一个TrustAllCertificatePolicy类:
public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy { public TrustAllCertificatePolicy() {} public bool CheckValidationResult(ServicePoint sp, System.Security.Cryptography.X509Certificates.X509Certificate cert, WebRequest req, int problem) { return true; } } |
然后,在请求之前加上
System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();
即可。
这样,代码就可以顺利和https服务器建立SSL通道了。
编写者:郑昀@UltraPower
[C#]用HttpWebRequest加载证书建立SSL通道时发生异常的解决办法相关推荐
- Linux系统安装驱动过程中ko文件加载错误(Required key not available)的解决办法
Linux系统安装驱动过程中ko文件加载错误(Required key not available)的解决办法 问题描述 在Ubuntu上使用CP210x USB转UART设备时需要安装驱动程序(CP ...
- 网站加载 Waiting (TTFB) 时间过长的原因和解决办法
关注网页前端性能的朋友,在优化网页性能的时候都会遇到网站加载 Waiting(TTFB)时间过长的问题.对于没有优化过的 WordPress 站点,TTFB 时间经常超过了页面内容的下载时间,为用户带 ...
- initpki.dll加载失败 找不到指定的模块的解决办法
有用户在更新Win10系统时,收到提示"模块'initpki.dll'加载失败.请确保该二进制存储在指定的路径中,或者调试它以检查该二进制或相关的DLL文件是否有问题.找不到指定的程序.&q ...
- mysql 远程load data,PyMySQL将(文件)数据加载到远程MySQL实例时发生错误/异常
我正在使用PyMySQL-0.5.0并在将数据从文件加载到远程MySQL实例时遇到了一个模糊的错误/异常.在执行"loaddatalocalinfile-"语句时,我看到一个异常, ...
- 电脑显示无法加载远程访问连接管理服务器,win10系统宽带连接提示无法加载远程访问连接管理器服务错误711的解决办法...
win10系统使用久了,好多网友反馈说win10系统宽带连接提示无法加载远程访问连接管理器服务错误711的问题,非常不方便.有什么办法可以永久解决win10系统宽带连接提示无法加载远程访问连接管理器服 ...
- Win11的两个实用技巧系列之加载驱动失败怎么办、占用内存高的解决办法
Win11加载驱动失败怎么办?Win11无法加载驱动程序的三种解决方法 win11用户在使用电脑的时候遇到了"无法在设备上加载驱动程序"的情况,导致有些软件无法正常使用,这种情况要 ...
- RHEL6.4启动一直在加载界面,无法进入图形化界面的解决办法
在下在上午的时候将我另一个机器上面的虚拟机拷贝到了我现在用的机器上,发现rhel6.4启动加载的时候一直开在这个界面: 如图: 就一直卡在这个界面了. 我用ctrl+shift+f1一看: 哎,有点迷 ...
- uniapp页面使用web-view加载网络url,导致底部组件被覆盖解决办法
<script>var wv;//计划创建的webviewexport default {onReady() {var px = uni.upx2px(120)var currentWeb ...
- php waiting ttfb,浅谈我们个人博客网站加载过程中Waiting(TTFB)时间过长的解决办法...
最近,我发现博客访问速度已经放缓.我检查了控制台,发现所有静态资源都在200ms内加载.只有第一份文件达到了6.65s.它被称为等待(TTFB). )占用主要加载时间的东西.具体的控制台显示内容如下: ...
最新文章
- 解题报告:SP1043 GSS4 - Can you answer these queries III(GSS线段树八部曲之三)(区间最大连续子段和)
- Confluence 6 数据库结构图
- 深度学习(十二)稀疏自编码
- C++11:forward及完美转发
- SecureCRT提示----数据库里没找到防火墙“无”----解决方案
- 为什么unity 安装完模块还是找不到sdk_解决在Android Studio 3.2找不到Android Device Monitor工具...
- 本地存储和移动端js框架及bootstrap简介
- 小贝拉机器人是朋友_报废机器人应该属于什么垃圾?《宝莱坞机器人2.0》给你答案...
- 文件指针和文件描述符之间的相互转换 fd----fp 和 fp----fd
- linux screen 命令是 ssh 的有效补充
- javascript 获取图片原始尺寸
- cvCompareHist() 直方图匹配
- 亚像素边缘检测提取算法的实现
- this的三种用法 详解
- android最强的平板,最强安卓游戏平板曝光,NVIDIA的Shield Tablet X1来了
- idea groovy自定义自动生成实体 dao/mapper service等,支持表注释 字段注释
- DeepSpeech语音转文本合成技术
- android pcm文件大小_Android中的PCM设备
- 关于thinkphp写入缓存失败的原因
- 关于CreateParams的参数