【问题标题】:HttpWebRequest SSL only working on some websitesHttpWebRequest SSL 仅适用于某些网站
【发布时间】:2009-10-31 11:00:50
【问题描述】:

我正在对 HttpWebRequest 进行一些试验,并且需要让它与 SSL 一起使用。它确实适用于某些网站(例如 PayPal),但不是我真正希望它适用的网站,例如 this 社区网站(URL 也在代码示例中)。为什么是这样?证书(我假设这可能是问题所在)看起来非常相似。

    public static bool AcceptAllCertificatePolicy(object sender,
                                            X509Certificate certificate,
                                            X509Chain chain,
                                            SslPolicyErrors sslPolicyErrors)
    {
        return true;
    }

    static void LoginTest()
    {

        ServicePointManager.ServerCertificateValidationCallback += AcceptAllCertificatePolicy;

        HttpWebRequest req = (HttpWebRequest)
        WebRequest.Create("https://steamcommunity.com");

        req.Method = "GET";

        req.CookieContainer = new CookieContainer();

        HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

        Console.WriteLine("Cookies:" + resp.Cookies.Count + "\r\n" + resp.ResponseUri);
        Console.WriteLine(resp.Headers);

        resp.Close();
    }

谢谢

编辑:网址不正确,抱歉。但问题仍然存在。

编辑2: 我忘了提到虽然它没有给我任何错误,但它也没有返回任何 cookie。这才是我真正追求的。 www.paypal.com 给了我 7 个 cookie,响应标头是

Pragma: no-cache
Cache-Control: private
Date: Sat, 31 Oct 2009 12:10:29 GMT
Expires: Thu, 05 Jan 1995 22:00:00 GMT
Set-Cookie: LANG=sv_SE%3bSE; expires=Tue, 29-Oct-2019 12:10:30 GMT; domain=.paypal.com; path=/,cookie_check=yes; expires=Tue, 29-Oct-2019 12:10:30 GMT; domain=.paypal.com; path=/,navcmd=_home-general; domain=.paypal.com; path=/,consumer_display=USER_HOMEPAGE%3d0%26USER_TARGETPAGE%3d0%26USER_FILTER_CHOICE%3d7%26BALANCE_MODULE_STATE%3d1%26GIFT_BALANCE_MODULE_STATE%3d1%26LAST_SELECTED_ALIAS_ID%3d0; expires=Sun, 31-Oct-2010 12:10:30 GMT; domain=.paypal.com; path=/,cwrClyrK4LoCV1fydGbAxiNL6iG=_Yi2Io2xQuP5-kmjAhh1KUJVMH6VTFfnf1Zlw1ONf41yAAUyLXUiLZ_9GJcPZmmNMl6kgpaG14eNnVA6jYlkyaK7h2IPqoPUsUobSg-gzEf4NsHrbwWzuCe8W50EIPW4ABaAkG%7c3EWGI8_elkol97q63exWWZMOA02gaDHo4_Y_7lKC_xHE2kWR8DZGXAmqs4uv075KRh6OW0%7ctJQpXroB_JJPd9EvK7Xx17DfiF9lz5vs06ThWWluWxwM3-WO82KChgIGdC080wwm5Q6vL0%7c1256991030; domain=.paypal.com; path=/,navlns=0.0; expires=Fri, 26-Oct-2029 12:10:30 GMT; domain=.paypal.com; path=/,Apache=10.190.11.252.1256991029926042; path=/; expires=Fri, 18-Sep-03 05:42:13 GMT
Server: Apache
Vary: Accept-Encoding
Strict-Transport-Security: max-age=500
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

虽然 steamcommunity.com 设置了 0 个 cookie,

Pragma: no-cache
Connection: close
Transfer-Encoding: chunked
Cache-Control: no-cache
Content-Type: text/html; charset=UTF-8
Date: Sat, 31 Oct 2009 12:14:25 GMT
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Server: Apache

即使它应该至少设置一个。

【问题讨论】:

    标签: c# ssl httpwebrequest


    【解决方案1】:

    为 firefox 安装 firebug。清除您的 cookie 缓存,然后导航到该站点。检查 firebug 以查看浏览器发送的确切请求是什么。然后使用代码复制完全相同的请求。这意味着复制浏览器发送的所有标头。

    如果某些服务器认为不是浏览器发出请求,它们将不会发送 cookie。因此,放置所有请求标头应该使其在网站上看起来就像浏览器正在请求页面一样。

    【讨论】:

      【解决方案2】:

      问题是证书对https://www.steamcommunity.com 无效,但对https://steamcommunity.com 有效。所以你所要做的就是改变你的网址:

      WebRequest.Create("https://steamcommunity.com");
      

      查看Issued to 标头。对于贝宝,它是Issued to: www.paypal.com,而对于您的网站,它是Issued to: steamcommunity.com


      更新:

      new WebClient().DownloadString("https://steamcommunity.com"); // works
      new WebClient().DownloadString("https://www.steamcommunity.com"); // throws invalid certificate
      

      【讨论】:

      • 这是我更改 URL 时的拼写错误,如果没有 www,它似乎也无法工作。
      • 对不起,我未能正确陈述我的原始问题。现在更新了。
      猜你喜欢
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-09
      相关资源
      最近更新 更多