我正在逐步淘汰对Web应用程序的TLS 1.0和TLS 1.1的支持。
我想检测用户,这将基于他们与我的服务器之间的连接而影响。
我正在运行Tomcat 7和Java 8。
如何检测HttpServletRequest的TLS版本?
这在Java中不切实际。它需要修改JSSE实现或插入替代方法。
我最终通过部署How’s My SSL并从客户端使用跨域AJAX来检查SSL状态并将其报告给我的应用服务器,从而解决了这一问题。
您需要来自客户端的未经代理的直接请求才能正确评估其SSL状态。不要将HTTPS负载平衡器放在“我的SSL方式”前面。它将破坏它并给您不正确的结果。
这是客户端JavaScript的一小段片段,应使用公共How’s My SSL服务(我建议部署您自己的SSL)来工作:
$.getJson('https://www.howsmyssl.com/a/check') .done(function (result) { $.post('/logs', { name: 'howsmyssl', level: 'info', message: result }); }) .fail(function(err) { $.post('/logs', { name: 'howsmyssl', level: 'error', message: 'could not reach howsmyssl' }); });
您将需要在您的应用服务器上的 / logs 上运行一个REST端点,该端点可以接收POST来捕获此消息。您可以根据自己的喜好更改该路径和消息格式。该端点应经过身份验证,并应在日志中添加事件时间,经过身份验证的主体(用户)以及其他可能的信息,例如IP地址。
结果的内容如下所示(漂亮打印以使其更易于阅读):
{ "given_cipher_suites": [ "TLS_GREASE_IS_THE_WORD_8A", "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256", "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", "TLS_RSA_WITH_AES_128_GCM_SHA256", "TLS_RSA_WITH_AES_256_GCM_SHA384", "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_RSA_WITH_AES_256_CBC_SHA", "TLS_RSA_WITH_3DES_EDE_CBC_SHA" ], "ephemeral_keys_supported": true, "session_ticket_supported": true, "tls_compression_supported": false, "unknown_cipher_suite_supported": false, "beast_vuln": false, "able_to_detect_n_minus_one_splitting": false, "insecure_cipher_suites": { }, "tls_version": "TLS 1.2", "rating": "Probably Okay" }
您可以将此日志记录到日志聚合器或数据库中,以供日后查询以查找要呼叫或发送电子邮件的特定用户。您甚至可以提醒用户您的应用程序中浏览器TLS的空白,并特别强调即将到来的TLS 1.2截止日期以及他们可以采取的更新浏览器补偿措施。