Chi*_*gum 28 .net c# asp.net iis ssl
由于合规性原因,我们必须在我们的网络服务器上关闭一些密码和SSL2的支持.这不是一个真正的问题,但我们也想在他们成功登录网站后通知他们,我们建议在他们尚未使用TLS 1.2连接到服务器的情况下在浏览器中启用TLS 1.2.所以我的问题是:
如何检测https请求中使用的协议和密码到IIS中运行的ASP.net(MVC 4)应用程序?
我知道有一些方法可以将SCHANNEL请求记录到事件日志中,然后再将它们读出来,但这对我来说听起来非常难看.
我已经看到System.Net.Security.SslStream有,我需要,例如性能:CipherAlgorithm,的HashAlgorithm,KeyExchangeAlgorithm&SslProtocol,但我不知道在那里我可以在mvc4在我的控制器动作获得这些属性应用.
Lar*_*ann 35
由ILSpy确定的坏消息是,无法System.Net.SslStream从ASP.NET内的任何地方获取实例.该类用于针对网络的直接编程,例如通过WCF框架.您可以从ASP.NET(无论是在IIS或HttpListener上使用System.Web或OWIN)做的最好的事情是获取服务器变量(请参阅IIS服务器变量列表),以确定连接是否受到协商的任何安全传输的保护与客户.
至于在Web请求期间确定性地从事件日志中读取数据......这看起来很可怕.但如果你能使它工作,请分享代码.:)
或者,您可以尝试实现自己的Owin主机(也就是Web服务器!),它使用SslStream下面的.也许.:P有关编程的详细介绍,请参阅此文章SslStream.
但既然你已经能够关闭某些协议的服务器上(在这篇文章中,我假设)...你可以设置你的网站上的两个不同的子域,如www.example.com和secure.example.com,其中前者是一个香草Web服务器和后者配置为仅接受TLS 1.2连接.然后你会编写一些自举逻辑,www.example.com并尝试发出一个AJAX请求secure.example.com/securityUpgradeCheck(可能是一个风格很好的微调动画和"请等待,试图保护这个连接"文本给你的用户留下深刻印象:)).如果该请求成功,则可以将用户重定向到secure.example.com(可能是永久性的,因为已知该用户代理支持TLS 1.2,除非由于某种原因用户更改其浏览器设置).
为了增加影响,请为安全域订购EV SSL证书,以便用户注意到安全性升级.:)
更新:我在编写自定义(本机)ISAPI过滤器(或扩展)的理论基础上进行了一些挖掘,以通过SChannel API获取此信息.起初我很有希望因为我发现了一个HSE_REQ_GET_SSPI_INFO返回SSPI CtxtHandle结构的函数,你可以通过该EXTENSION_CONTROL_BLOCK ServerSupportFunction函数从自定义ISAPI扩展调用它.CtxtHandle事实证明,该结构代表了一个SChannel上下文,可以为您提供一个SECPKG_ATTR_CONNECTION_INFO属性的引用,您可以使用该属性检索SSL连接级信息(SslStream就我所知,在.NET 中的类中显示的信息相同) .然而,遗憾的是,微软预计了这种可能性并决定只有在使用客户端证书时才能获得此信息.行为是"按设计".
有一个(本机)SSPI函数,QueryContextAttributes (Schannel)我在通过MSDN进行长期搜索时发现它可能有效.我没有尝试过,它可能因为与上面链接的ISAPI API限制相同的"按设计"原因而失败.但是,它可能值得一试.如果您想探索此路由,以下是ISAPI扩展的示例.实际上,使用这种方法,您可以使用较新的IIS 7.0+ SDK编写IIS模块.
但是,假设您没有要求客户端证书的奢侈品并且远射不起作用,那绝对只留下两个选项.
顺便说一下 - 您的负载均衡器是否配置为执行任何SSL拦截?因为那时候整个事情都没有实际意义......只是想一想.
更新:启用Schannel日志记录净化此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>
Run Code Online (Sandbox Code Playgroud)
这可以直接从托管代码中读取.我认为UserID仅对应于IIS工作进程SID,但假设您可以提出某种相关启发式,您可以设置后台线程来连续轮询事件日志并为您提供最近建立的客户端列表握手(ConcurrentDictionary或许使用).
那里.而已.没有更好奇的调查我.我受够了.:P
我们有兴趣读这个,因为我们有完全相同的问题.
在我看来,必须有一个公共网络服务来查询这类信息,我做了一些研究,发现了这个:https: //www.howsmyssl.com/s/api.html
API就在这里
可以从客户端Javascript调用此API,它返回标准JSON,可以轻松解析并向用户显示合适的警报.
您还可以将信息发送到您自己的Web服务以进行日志记录,并尝试将信息与现有的IIS日志结合使用.
您面临的唯一问题是依赖第三方.这可以通过站起来自己的服务器并托管GitHub上免费提供的代码来缓解.
我们将开始研究这个解决方案,所以一旦我有了一些代码,我将更新这个答案.
再次感谢Lars的上述综合答案.我会将此作为对该帖子的评论添加,但我认为值得创建一个单独的答案,以便人们可以更容易地找到它.
| 归档时间: |
|
| 查看次数: |
12167 次 |
| 最近记录: |