C# HttpWebRequest 获取 HTTPS 网页内容

简介: C# HttpWebRequest 获取 HTTPS 网页内容

在 C# 中,可以使用 HttpWebRequest 类来获取 HTTPS 网页内容。需要注意的是,HTTPS 网页采用了 SSL/TLS 加密传输机制,必须在发送请求之前获取服务器端的证书并进行验证才能成功获取网页内容。下面是一份示例代码,演示如何获取 HTTPS 网页内容:

using System;
using System.IO;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
 
class Program
{
    static void Main(string[] args)
    {
        ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
        string url = "https://example.com";
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "GET";
        request.ProtocolVersion = HttpVersion.Version11;
        request.AllowAutoRedirect = true;
        request.ContentType = "application/x-www-form-urlencoded";
        request.CookieContainer = new CookieContainer();
        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {        
            Stream stream = response.GetResponseStream();
            string html = string.Empty;
            using (StreamReader reader = new StreamReader(stream))
            {
                html = reader.ReadToEnd();
                Console.WriteLine(html);
            }
        }
    }
 
    private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
    {
        return true; //如果不希望验证证书有效性,直接返回 true
    }
}


在上述代码中,我们首先设置了 ServicePointManager.ServerCertificateValidationCallback 回调函数,该回调函数会在服务器端的证书被验证的时候被调用,当回调函数返回 true 时,表示服务器端的证书验证通过,否则会抛出一个 SSL 异常。接下来,我们创建了一个 HttpWebRequest 构造函数,指定了要获取的 HTTPS 网页的 URL 地址,并设置了一些请求头参数。最后,我们在获取到响应流之后,读取响应流内容,并输出到控制台上。


在实际应用过程中,为了提高安全性,我们应该对服务器端证书进行验证,保证访问的网站是我们信任的网站,防止遭受网络攻击。关于验证服务器端证书需要注意以下几点:如果服务器端证书的颁发机构是受信任的颁发机构,验证可以简化为检查证书的原始日期和过期日期是否合法。你可以使用 certificate.GetExpirationDateString() 和 certificate.GetEffectiveDateString() 函数分别获取证书的原始日期和过期日期,再使用 DateTime.Parse() 函数将其转换为 DateTime 类型。


如果服务器端证书的颁发机构是自签署的或不受信任的颁发机构,那么你需要通过比较证书中的公钥和期望值来验证证书的有效性。你可以使用 certificate.GetPublicKeyString() 函数获取证书的公钥,然后与你预期的公钥进行比较。


如果你希望进一步加强服务器端证书的验证,可以通过检查证书的完整性、状态、可用性等等。可以通过 ChainPolicy() 函数来实现。


以下是一个示例,演示如何通过 ChainPolicy() 函数进行服务器端证书的验证:

private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{    
    if (errors == SslPolicyErrors.None)
    {
        return true; //如果没有 SSL 错误,直接返回 true
    }
 
    Console.WriteLine("Certificate error: {0}", errors);
 
    // 如果是自签名证书,则直接忽略错误
    if (errors == SslPolicyErrors.RemoteCertificateChainErrors && chain.ChainStatus.Length == 1)
    {
        X509ChainStatus chainStatus = chain.ChainStatus[0];
        if (chainStatus.Status == X509ChainStatusFlags.UntrustedRoot || chainStatus.Status == X509ChainStatusFlags.PartialChain)
        {
            return true;
        }
    }
 
    // 验证服务器端证书的完整性、状态、可用性等等
    X509ChainPolicy chainPolicy = new X509ChainPolicy();
    chainPolicy.RevocationFlag = X509RevocationFlag.EntireChain;
    chainPolicy.RevocationMode = X509RevocationMode.Offline;
    chainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 1, 0);
    chainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;
    chain.ChainPolicy = chainPolicy;
 
    bool isChainValid = chain.Build((X509Certificate2)certificate);
 
    if (!isChainValid)
    {
        Console.WriteLine("Chain validation failed!");
        foreach (X509ChainStatus chainStatus in chain.ChainStatus)
        {
            Console.WriteLine("ChainStatus: {0} - {1}", chainStatus.Status, chainStatus.StatusInformation);
        }
        return false;
    }
 
    return true;
}


相关文章
|
4天前
|
存储 安全 测试技术
C# 中模拟HTTPS提交及模拟文件上传
【1月更文挑战第5天】昨天讲到用C#模拟POST还有GET进行数据提交,如果遇到的是https或者一些特殊信道的提交昨天的代码就会跑不通,今天就来说一下C#中https的提交以及模拟文件上传
|
应用服务中间件 nginx
https网页加载http资源时不显示图片,报错解决方案
本文是博主学习网络知识的记录,希望对大家有所帮助。
3713 0
https网页加载http资源时不显示图片,报错解决方案
|
4天前
|
数据采集 API C#
网页解析高手:C#和HtmlAgilityPack教你下载视频
使用C#和HtmlAgilityPack解析小红书网页,下载其视频内容。文章涵盖了解析网页、获取视频链接、C#实现、HtmlAgilityPack简化解析、代理IP确保下载稳定及多线程提高下载效率。提供的代码示例展示了如何设置代理和多线程下载视频。实验结果显示,该方法能有效、高效地下载小红书视频。
网页解析高手:C#和HtmlAgilityPack教你下载视频
|
4天前
|
API C# 数据安全/隐私保护
C# 实现网页内容保存为图片并生成压缩包
C# 实现网页内容保存为图片并生成压缩包
|
4天前
|
缓存 前端开发 搜索推荐
深入解析HTTP状态码:网页背后的故事
深入解析HTTP状态码:网页背后的故事
49 0
|
10月前
|
域名解析 网络协议 Windows
github:网址为 https://github.com/ 的网页可能暂时无法连接,或者它已永久性地移动到了新网址
github:网址为 https://github.com/ 的网页可能暂时无法连接,或者它已永久性地移动到了新网址
677 0
|
11月前
|
移动开发 应用服务中间件 Linux
35.从入门到精通:Python CGI编程 什么是CGI 网页浏览 CGI架构图 Web服务器支持及配置 第一个CGI程序 HTTP头部
35.从入门到精通:Python CGI编程 什么是CGI 网页浏览 CGI架构图 Web服务器支持及配置 第一个CGI程序 HTTP头部
|
11月前
|
数据采集 C#
使用c#和selenium获取网页
selenium 和 c# 的应用之一是创建一个网络爬虫,它可以从网页中抓取数据进行分析。网络爬虫是一种访问网页并从中提取信息的程序。 Selenium 是一个框架,它允许我们自动执行浏览器操作,例如单击、键入或导航。 C# 是一种编程语言,可用于编写网络爬虫的逻辑和功能。
110 0
|
12月前
|
开发框架 移动开发 前端开发
如何使用C#和HTMLAgilityPack抓取网页
HTMLAgilityPack是一款备受欢迎的用于解析和操作HTML文档的库。在使用之前,开发者需要考虑一些优缺点。下面是一些值得注意的优点: 1. 强大的错误容忍性 2. 灵活的API 3. 广泛的应用场景 然而,也有一些缺点需要考虑: 1. 性能问题 2. 对最新HTML特性的支持限制 3. 可能存在依赖和冲突
获取网页数据 Qt 从客户端发起http响应
获取网页数据 Qt 从客户端发起http响应
177 0