使用servlet 3.0的JBoss 6的会话安全性问题

Ale*_*lex 12 java security tomcat servlet-3.0 jboss6.x

我们将应用程序从JBoss 5迁移到JBoss6,其中一个主要原因是利用了servlet 3.0的新功能.除了JBoss 6和servlet 3.0的一个新功能之外,一切正常:将会话cookie设置为仅通过安全通道传输,即使请求是通过纯HTTP进行的.这对我们来说是一个非常重要的安全功能,可以通过添加来实现

<secure>true</secure>
Run Code Online (Sandbox Code Playgroud)

在web.xml中.这是我们web.xml的一部分:

<session-config>
<session-timeout>25</session-timeout>
<cookie-config>
    <http-only>true</http-only>
    <secure>true</secure>
</cookie-config>
<tracking-mode>COOKIE</tracking-mode>
Run Code Online (Sandbox Code Playgroud)

当我们删除

<secure>true</secure>
Run Code Online (Sandbox Code Playgroud)

一切正常.当它存在时,即使在安全页面(HTTPS)或不安全页面(HTTP)上,也会为每个请求生成新的jsessionid.此外,登录无效,因为在使用安全凭据登录后,用户将被重定向回登录页面.

我想这可能也是Tomcat 7的一个问题,因为它也使用了servlet 3.0规范.任何建议将不胜感激.

问候

Eva*_*tti 2

根据HTTP 规范

安全的

选修的。Secure 属性(无值)指示用户代理在发回此 cookie 时仅使用(未指定的)安全方式来联系源服务器。

用户代理(可能在用户的控制下)可以确定它认为适合“安全”cookie 的安全级别。Secure 属性应被视为从服务器到用户代理的安全建议,表明保护 cookie 内容符合会话的利益。

这意味着规范将其开放给浏览器(用户代理)来定义什么是“安全”。

Secure中的元素是HTTP Cookie 安全属性web.xml的引用,您可以使用浏览器的调试工具跟踪该值。

如果通信不“安全”,浏览器将不会在以下请求中将收到的 cookie 发送到服务器。

问题不在于 JBoss 总是返回新的 cookie,而在于浏览器由于通信不安全而没有发回新的 cookie。然后,JBoss 为每个请求创建一个新会话。

很明显,对于非加密通信(不是 HTTPS),浏览器不会发送 cookie,这是预期的,因为您将 cookie 标记为secure = true.

但是,即使您使用HTTPS,“安全”也是对于浏览器的安全概念而言的,例如:

  • 证书可能过期
  • 证书是自签名的
  • 您使用的主机名与签署证书的主机名不同

使用 TLS 可能会出现这些和其他安全问题,这意味着通信不安全

问题一定出在您的 SSL/TLS 或 Cookie 配置上,这意味着您必须检查您所做的操作并隔离问题。我认为 JBoss 或 JBossWeb(Tomcat 6 分支)中没有任何错误导致它,并且可以肯定它不是规范错误。

我能够使用 TLS 和您的web.xml配置来配置 JBoss 6.1.0 Final,一切都按预期进行。

我建议您仔细检查您的配置、浏览器调试和警报。