【问题标题】:how renegociate SSL-connection every time = different ssl-SessionID ( windows ,c#)每次如何重新协商 SSL 连接 = 不同的 ssl-SessionID ( windows , c#)
【发布时间】:2019-05-07 05:35:53
【问题描述】:

如何在 C#/Windows7 中做到我的应用不重用现有的 SSL 连接。实际上,当我使用HttpWebRequest 向 https 页面发出获取请求时,如果存在现有连接,那么它会使用此连接(= 相同的 ssl-sessionid)。我做了一些测试,Windows 7 在 2 分钟后重新协商了 ssl 连接。但我希望它永远不会重用现有的连接。

我尝试了很多东西: 保持活动状态,ClientCacheTime (regedit),ServicePointManager.SetTcpKeepAlive ...

非常感谢!

            ServicePointManager.Expect100Continue = true;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
            ServicePointManager.DnsRefreshTimeout = 200;
           /* ServicePointManager.SetTcpKeepAlive(false,0,0);
            ServicePointManager.DefaultConnectionLimit = 100;
            ServicePointManager.MaxServicePointIdleTime = 1;*/
        //    ServicePointManager.DefaultConnectionLimit = 1;
            uri = "https://server.com/test.jsp";

            HttpWebRequest request = (HttpWebRequest)
          WebRequest.Create(uri);
            request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 6.0)";
            request.CookieContainer = cookieJar;
            request.ContentType = "text/xml";// content type

            request.KeepAlive = false;
            request.ProtocolVersion = HttpVersion.Version11;
            request.Method = "GET";
            request.ConnectionGroupName = "dsd" + i;
           // request.ReadWriteTimeout = 2000;
           /* request.Timeout = 5000;
            request.UseDefaultCredentials = false;
            request.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);
            request.ConnectionGroupName = DateTime.Now.Ticks.ToString(); */
           // X509Certificate2 cert = new X509Certificate2("C:\\a.crt", "abcd");
           X509Certificate2 cert = new X509Certificate2();
            request.ClientCertificates.Add(cert);
           /* request.PreAuthenticate = false;
            request.Pipelined = true;*/


            WebResponse rsp = request.GetResponse();
            string PageContent = new StreamReader(rsp.GetResponseStream()).ReadToEnd();


            textBox1.Text = PageContent;
            request.ServicePoint.CloseConnectionGroup("dsd" + i);
            request.Abort();

            request.ClientCertificates.Clear();
            rsp.GetResponseStream().Close();
            rsp.Close();
            request.Abort();

【问题讨论】:

标签: c# ssl


【解决方案1】:

由于您没有提供太多详细信息,因此仅提供一些一般性指针:

以上内容可能不可靠 - 取决于操作系统版本和框架版本...

我很好奇:实现这意味着您的性能会降低很多......目标是什么?

【讨论】:

  • 感谢您的回答。我已经输入了一些代码并尝试了您所说的,但它不起作用:(。有一个处理 ssl 连接的 windowsdll(SCHANNEL.dll) 是否有可能杀死(卸载)它并每次重新加载它?我使用 VS 2010 Express ,4.0.. 用于测试目的..
  • 杀死/卸载它可能会影响整个系统 - 所以这不是一个好主意......也许最好在单独的 EXE 中拥有 SSL 访问权限并在每个请求上启动该 EXE,并且事后杀死它...
  • 我试图杀死并重新启动 exe,但我认为这也不起作用,我必须卸载/重新加载处理 SSL 的 SCHANNEL.dll,如果你有一些很好的代码或如果在 c# 中太复杂,可以通过 cmd 使用的外部工具。谢谢
  • 我不认为这样做会有所帮助 - SCHANNEL.dll 是系统范围的,这意味着您可能会干扰整个操作系统!如果你真的必须做你想做的事,那么使用第三方库来处理整个 SSL 而不使用任何 OS API - 这样你就可以实现你所描述的......
  • 好的,谢谢,我找到了这个msdn.microsoft.com/en-us/library/aa379810(VS.85).aspx,dwSessionLifespan 是你需要改变的,我正在寻找这样做......
猜你喜欢
  • 1970-01-01
  • 2016-02-17
  • 2019-03-11
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 2018-07-25
相关资源
最近更新 更多