【问题标题】:Create a SSL WebRequest with C#使用 C# 创建 SSL WebRequest
【发布时间】:2012-01-07 06:19:49
【问题描述】:

我正在编写一个读取页面并以编程方式下载其内容的代码,但它的工作方式与浏览器不同。 请注意,我也在使用 cookie 字符串。

我的代码是:

string strUrl = "http:" + "//mgac.webex." + "com";
string cookies_str = "vSeg=post_attendee; s_nr=1321305381566-New; s_lv=1321305381566; s_vnum=1322686800567%26vn%3D1; galaxyb_wl=R2355168776; JSESSIONID=Qlq1TR7Hf09KTsGHr4vv2GnTFF0NGRlLmGyYmMvzY5M29pbZ8yNp!31020270; DetectionBrowserStatus=3|1|32|1|4|2; CK_LanguageID_503319=1; CK_TimeZone_503319=4; CK_RegionID_503319=2; vSeg=post_attendee; s_nr=1321305381566-New; s_lv=1321305381566; s_vnum=1322686800567%26vn%3D1; galaxyb_wl=R2355168776; JSESSIONID=Qlq1TR7Hf09KTsGHr4vv2GnTFF0NGRlLmGyYmMvzY5M29pbZ8yNp!31020270;";
string other_saved_cookies = "screenWidth=1280; CK_CDNHostStatus=akamaicdn.webex.com|1322367753273|1";

string s;
using (WebClient client = new WebClient())
{
    client.UseDefaultCredentials = true;
    client.Headers.Add(HttpRequestHeader.Cookie, cookies_str);
    s = client.DownloadString(strUrl);
}

我得到这个答案: “找不到页面...”

当我使用 Fiddler 扫描请求时,我的浏览器收到相同的答案,之后他向同一主机发出使用 SSL 的新请求。

我怎样才能发出完全相同的请求来像浏览器一样接收内容

告诉客户端的信息在哪里:“需要 SSL 连接”?

【问题讨论】:

    标签: c# https httpwebrequest webbrowser-control


    【解决方案1】:

    这看起来像你想要的 How to use HTTP GET request in C# with SSL? (protocol violation)

    但是将“http”更改为“https”可能是一个很好的起点!
    然后,显然,设置一个 ServicePointManager.ServerCertificateValidationCallback,如对上述帖子的回复中的 2 所示。

    编辑

    添加

    string ua = "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0";
    

    然后

    client.Headers.Add(HttpRequestHeader.UserAgent, ua);
    

    然后解析重定向结果的Location头。

    【讨论】:

    • 客户端如何知道需要安全连接?我无法在响应中得到它
    • 严格来说,我认为您无法从响应中推断出需要 SSL。请参阅此 SO 线程:stackoverflow.com/questions/2554778/…
    • 我不想推断,我只想编写代码,如果需要,它会建立一个 https 连接,从对 http 的第一个响应中理解它,与代码显示的方式完全相同,您可以尝试使用示例代码中指定的相同 url。
    • 当您从浏览器发出请求时,使用 Fiddler 进行更详细的查看。如果添加 User-Agent 字符串,响应会有所不同。如果没有该标头,您将获得重定向(302),然后是成功(200)。使用该标头,您将获得一个重定向,然后是另一个带有 Location 标头的重定向,将您指向 https 站点。所以试试,例如: string ua = "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0"; client.Headers.Add(HttpRequestHeader.UserAgent, ua);然后解析头部。
    【解决方案2】:

    此网站使用 302 重定向将您带到 SSL 页面。

    WebClient .NET 类是一个自动跟随重定向的智能类。 它使用 HttpWebRequest 类并将 AllowAutoRedirect 设置为 true。

    因此,如果您向原始 URL 发出请求,WebClient 会跳过重定向(使用新请求),而结果是 302(某种重定向)。如果结果代码不同,您将得到结果。它看起来像一个 http 请求,但它执行了 2 个 http 和 1 个 https 调用。

    在这种情况下,您必须将用户代理设置为 shunty 之前发布的,因为远程站点不喜欢 .NET 的默认用户代理:无。

    【讨论】:

      【解决方案3】:

      查看这个msdn链接HTTP Security and ASP.NET Web Services

      默认情况下,要求安全通道 (SSL) 复选框是清除的; 选择它以要求 SSL。 SSL 支持 40 位和 128 位 加密。加密使用的位数越多,就越难 打破它并找出原始位是什么。

      将资源设置为需要 SSL 进行通信后, 发送者和接收者之间发送的任何消息都将被加密 并签字。这意味着外部各方无法读取内容 的消息。如果外部方更改了消息中的字节, 消息接收者可以检测到它。

      您应该需要一些凭据或证书信息才能完美运行您的代码。

      您可以使用 RemoteCertificateValidationCallback 委托 验证 SSL 证书

      查看这些链接以获取代码帮助:

      ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);
      

      How to use HTTP GET request in C# with SSL? (protocol violation)

      How do I use WebRequest to access an SSL encrypted site using https?

      【讨论】:

      • 在开始浏览器进行http(不安全)连接时,它会收到“找不到页面”,但是告诉浏览器他必须进行安全连接的信息在哪里?跨度>
      【解决方案4】:

      如果您只是想通过 https (ssl) 加载页面,这将起作用。如果你想看一下证书,我建议使用完整的 delgate 方法

      ServicePointManager.ServerCertificateValidationCallback = ( ( sender , certificate , chain , sslPolicyErrors ) => true );         //allows for validation of SSL certificates 
      

      或使用完整的委托方法

      ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback( delegateHttpSsl );
      
              private bool delegateHttpSsl(object obj, System.Security.Cryptography.X509Certificate c1, System.Security.Cryptography.X509Certifciates.X509Chain c2, SslPolicyErrors c3)
              {
                    return true;
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-15
        • 2017-05-25
        • 1970-01-01
        • 2016-07-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多