c# - 使用 .net WebClient 访问交叉签名的 SSL 服务

标签 c# .net ssl https webclient

我有一个小型 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 证书

  1. 从浏览器查看网站的证书。
  2. 在“证书路径”选项卡上,选择根 CA 证书(位于链的顶部)。
  3. 点击“查看证书”按钮
  4. 在根 CA 证书的“详细信息”选项卡上,单击“复制到文件”。 (DER 编码的 .CER 很好)。

信任根CA

  1. 打开计算机的证书 MMC 管理单元(开始 > mmc > 添加管理单元 > 证书)
  2. 导航到“受信任的根证书颁发机构”文件夹
  3. 右键单击“证书”文件夹,选择“所有任务”>“导入”。
  4. 浏览到 .cer 文件并按照向导操作。

关于c# - 使用 .net WebClient 访问交叉签名的 SSL 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19377434/

相关文章:

c# - 最佳选择如何在 C# 中使用 RegEx 或 LINQ 查找字符串中的最后 2 位数字?

c# - 错误/警告显示在 "Error List"上,但网站项目随后消失

.net - 使用NAudio howto捕获播放的信号

.net - 如何从 SQL Server 加载巨大的聚合(40+表,500+列)?

java - Secure Webservice 在 JDev 11.1.1.2 (WL Server 10.3.2) 中有效,但在 JDev 11.1.1.6 (WL Server 10.3.5) 中无效

javascript - 将图像从网络摄像头上传到服务器

c# - ASP.Net Core 3.0 SignalR HubConnection.InvokeAsync 抛出 : The JSON property name for 'whatever' collides with another property

c# - 将 Func<T, int> 值插入 linq-2-sql 查询

java - 在没有证书的 SSL 握手中添加客户端身份验证

ssl - Fiddler:我可以将来自外部控制台应用程序的传出流量重定向到 Fiddler 实例 (localhost:8888) 吗?