检查ssl协议、密码;asp.net MVC 4应用程序中的其他属性

本文关键字:应用程序 属性 其他 MVC net 协议 ssl 密码 asp 检查 | 更新日期: 2023-09-27 18:15:15

由于遵从性的原因,我们不得不关闭对某些密码和SSL2在我们的web服务器上的支持。这不是一个真正的问题,但我们也想通知他们,在他们成功登录到网站后,我们建议在他们的浏览器中打开TLS 1.2,以防他们还没有用TLS 1.2连接到服务器。所以我的问题是:

我如何检测在https请求中使用的协议和密码在IIS中运行的ASP.net (MVC 4)应用程序?

我知道有一些方法可以将SCHANNEL请求记录到事件日志中,然后再次读取它们,但这对我来说听起来非常难看。

我已经看到了 system.net.security.net。SslStream具有我需要的属性,例如:密码算法,hashalgalgorithm, KeyExchangeAlgorithm &SslProtocol,但我不确定在哪里我可以得到这些属性在我的控制器动作在mvc4应用程序

检查ssl协议、密码;asp.net MVC 4应用程序中的其他属性

坏消息是,正如ILSpy所确定的那样,没有办法从ASP.NET中的任何地方访问System.Net.SslStream实例。该类用于针对网络的直接编程,例如WCF框架。你能做的最好的ASP。. NET(是否使用System. NET)Web或OWIN(在IIS或HttpListener之上)是获取一个服务器变量(参见IIS服务器变量列表),用于确定连接是否通过与客户端协商的任何安全传输来保护。

至于在web请求期间从事件日志中确定地读取数据…这看起来很可怕。但如果你能让它工作,请分享代码。:)

或者,你可以尝试实现你自己的Owin主机(又名web服务器!),在下面使用SslStream。也许吧。:P有关SslStream编程的详细介绍,请参阅本文。

但是由于您已经能够关闭服务器上的某些协议(我假设在本文中是这样)…您可以在两个不同的子域上设置站点,例如www.example.comsecure.example.com,其中前者是一个普通的web服务器,后者配置为仅接受TLS 1.2连接。然后,您将编写一些从www.example.com获得服务的引导逻辑,并尝试向secure.example.com/securityUpgradeCheck发出AJAX请求(可能使用风格不错的旋转动画和"请等待,尝试保护此连接"文本来打动用户:))。如果该请求成功,则可以将用户重定向到secure.example.com(可能是永久的,因为该用户代理已知支持TLS 1.2,除非出于某种原因用户更改了浏览器设置)。

对于额外的影响,为安全域订购EV SSL证书,这样您的用户就会注意到安全性的升级。:)

UPDATE:我在编写自定义(本机)ISAPI过滤器(或扩展)的理论基础上进行了更多的挖掘,以通过channel API获取此信息。起初我很有希望,因为我发现了一个函数 HSE_REQ_GET_SSPI_INFO ,它将返回一个SSPI CtxtHandle结构,并且您可以通过EXTENSION_CONTROL_BLOCK ServerSupportFunction函数从自定义ISAPI扩展调用它。事实证明,CtxtHandle结构表示通道上下文,可以为您提供对SECPKG_ATTR_CONNECTION_INFO属性的引用,您可以使用该属性检索SSL连接级信息(据我所知,与. net中的SslStream类中出现的信息相同)。然而,遗憾的是,微软预见到了这种可能性,并决定只有在使用客户端证书时才能使用此信息。行为是"设计的"。

有一个(本地)SSPI函数, QueryContextAttributes (Schannel) ,我在通过MSDN的长时间搜索中发现可能工作。我还没有尝试过,它可能会因为与上面链接的ISAPI API限制相同的"设计"原因而失败。然而,这可能值得一试。如果您想探索这条路线,这里有一个ISAPI扩展的示例。实际上,使用这种方法,您可以使用较新的IIS 7.0+ SDK编写IIS模块。

但是,假设您没有要求客户端证书的奢侈,并且这种可能性不大,那么绝对只剩下两种选择。

  1. 使用不同的web服务器(Apache等),运行在相同的物理/虚拟机上,但在不同的端口上,等等(根据我们在评论中的讨论,因为你不能启动另一台机器)。如果您只想向客户机提供信息消息,那么这种方法加上AJAX请求可能就足够了。是的,不同的端口很可能被某个地方的防火墙阻塞,但是嘿-无论如何,这只是一个可选的信息消息。
  2. 对系统事件日志依赖半脆性方法。启用通道事件日志记录,然后编写一些事件日志查询代码,以尝试将请求与最后记录的通道事件关联起来。请注意,您需要找到一种方法来可靠地将事件日志中的任何内容与当前HTTP请求关联起来,因此您可能还需要在本例中编写ISAPI过滤器/扩展或IIS模块来找到channel上下文句柄(这是我假设相关性将基于的)。

顺便说一下-你的负载均衡器配置为做任何SSL拦截吗?因为这样整件事就没有意义了…只是考虑一下。

UPDATE:启用通道日志使此gem生效:

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Schannel" Guid="{1F678132-5938-4686-9FDC-C8FF68F15C85}" /> 
    <EventID>36880</EventID> 
    <Version>0</Version> 
    <Level>4</Level> 
    <Task>0</Task> 
    <Opcode>0</Opcode> 
    <Keywords>0x8000000000000000</Keywords> 
    <TimeCreated SystemTime="2014-08-13T02:59:35.431187600Z" /> 
    <EventRecordID>25943</EventRecordID> 
    <Correlation /> 
    <Execution ProcessID="928" ThreadID="12912" /> 
    <Channel>System</Channel> 
    <Computer>**********</Computer> 
    <Security UserID="S-1-5-18" /> 
  </System>
  <UserData>
    <EventXML xmlns:auto-ns3="http://schemas.microsoft.com/win/2004/08/events" xmlns="LSA_NS">
      <Type>client</Type> 
      <Protocol>TLS 1.2</Protocol> 
      <CipherSuite>0x3c</CipherSuite> 
      <ExchangeStrength>2048</ExchangeStrength> 
    </EventXML>
  </UserData>
</Event>

可以直接从托管代码中读出。我认为UserID只对应于IIS工作进程SID,不幸的是,但假设你能想出某种相关性启发式,你可以设置一个后台线程来不断地轮询事件日志,并给你一个最近建立的客户端握手列表(也许使用ConcurrentDictionary)。

。就是这样。我再也不用好奇地调查了。我完成了。: P

饶有兴趣地阅读这篇文章,因为我们有完全相同的问题。

我想到一定有一个公共网络服务可以查询这类信息,我做了一点研究,发现如下:https://www.howsmyssl.com/s/api.html

API在这里

这个API可以从客户端Javascript调用,它返回标准的JSON,可以很容易地解析和适当的警告显示给你的用户。

您也可以将信息发送到您自己的web服务用于记录目的,并尝试将这些信息与您现有的IIS日志相结合。

你面临的唯一问题是依赖第三方。这可以通过建立自己的服务器并托管GitHub上免费提供的代码来缓解。

我们将在这个解决方案上工作,所以一旦我有一些代码到位,我将更新这个答案。

再次感谢Lars在上面的全面回答。我本想把这个作为评论添加到那篇文章中,但我认为值得创建一个单独的答案,这样人们就能更容易地找到它。

如何从服务器检查协商的TLS握手?有办法在IIS 8.5和更高的ASP中实现这一点。. Net MVC/WebAPI。至少在我昨天回答这个问题时,它对我和其他几个人有效。