我有一个小型 C# 应用程序,它使用 WebClient 通过 HTTPS(URL 以 https://开头)从 Web 服务下载数据。以下方法长期有效:
public class WebClientEx : WebClient {
public int Timeout {get; set;}
protected override WebRequest GetWebRequest(Uri address) {
var request = base.GetWebRequest(address);
if (request != null)
request.Timeout = Timeout;
return request;
}
}
using (var client = new WebClientEx()) {
client.Proxy = new WebProxy(ProxyUrl) { Credentials = CredentialCache.DefaultCredentials };
client.Timeout = 900000;
var fields = new NameValueCollection { /* .... */ };
byte[] respBytes = client.UploadValues(url, fields);
/* .... */
}
但是,网络服务提供商最近更新了他们的 SSL 证书,现在我得到了这个:
基础连接已关闭:无法为 SSL/TLS 安全通道建立信任关系。
我可以禁用 SSL 验证以“让它工作”:
public class WebClientEx : WebClient {
public int Timeout {get; set;}
protected override WebRequest GetWebRequest(Uri address) {
var request = base.GetWebRequest(address);
if (request != null)
request.Timeout = Timeout;
if (SSLCheckDisabled) {
try {
//Change SSL checks so that all checks pass
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
}
catch {
}
}
return request;
}
}
但出于显而易见的原因,我不想这样做!
在 Windows 7 + IE9 上,证书很好并且在 IE 中完全受信任。在使用 .NET Framework 4.0 WebClient 访问 Web 服务的 Windows 2003 服务器上,IE6 在安全警报中显示:
安全证书是由您未选择信任的公司颁发的。查看证书以确定您是否要信任证书颁发机构。
链末端的“不可信”证书是:
颁发给:DigiCert High Assurance EV Root CA
颁发者:DigiCert High Assurance EV Root CA
This troubleshooting page在顶部说“此路径中的根证书名为 DigiCert High-Assurance EV Root CA,并且已被所有现代浏览器信任。”。当我测试它们时,所有在线 SSL 检查器都会通过域。
所以我的问题是 - 如何让我的 WebClient 表现得更像 IE9 而不是 IE6,并信任这个交叉签名的 SSL 证书?
最佳答案
如果您的计算机信任根 CA,那么您就信任该 CA 颁发的证书。您需要将 Digicert Root CA 证书添加到计算机的 Trusted Root CA 组中。这可以使用计算机帐户的证书 MMC 管理单元来完成。
导出根 CA 证书
- 从浏览器查看网站的证书。
- 在“证书路径”选项卡上,选择根 CA 证书(位于链的顶部)。
- 点击“查看证书”按钮
- 在根 CA 证书的“详细信息”选项卡上,单击“复制到文件”。 (DER 编码的 .CER 很好)。
信任根CA
- 打开计算机的证书 MMC 管理单元(开始 > mmc > 添加管理单元 > 证书)
- 导航到“受信任的根证书颁发机构”文件夹
- 右键单击“证书”文件夹,选择“所有任务”>“导入”。
- 浏览到 .cer 文件并按照向导操作。
关于c# - 使用 .net WebClient 访问交叉签名的 SSL 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19377434/