2017-01-23 71 views
2

我正在逐步停止对Web应用程序的TLS 1.0和TLS 1.1的支持。如何检测HttpServletRequest的TLS版本?

我想检测用户,这将影响到他们对我的服务器的连接。

我运行Tomcat 7和Java 8

如何检测为HttpServletRequest的TLS版本?

+1

这是一个老问题。恐怕tomcat不会发布'SSLSession'。你是使用tomcat standalone还是像apache或nginx这样的代理? – pedrofb

+0

在AWS ELB后面使用Tomcat。我想如果我放弃apache或nginx我可以在模块中运行TLS 1.2检测? –

+0

@pedrofb和旧的你的意思是在各种论坛上以各种方式提出问题,迄今为止还没有确切的答案。我看了一下Servlet API的源码和Tomcat的源码,发现没有好的答案。它看起来像反射的深度hackery可能会解决这个问题,但它会非常脆弱。 –

回答

0

这在Java中并不实用。它需要修改JSSE实现或插入替代方案。

我最终通过部署How's My SSL并使用客户端的跨域AJAX来检查SSL状态并将其报告给我的应用服务器来解决此问题。

您需要有来自客户端的未提交的直接请求才能正确评估其SSL的状态。不要将HTTPS负载平衡器放在How's My SSL之前。它会打破它,给你不正确的结果。

下面是客户端JavaScript代码,可应努力利用公共如何是我的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' 
    }); 
}); 

你需要有一个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截止日期以及他们可以采取的步骤来更新浏览器以进行补偿。