12

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

<secure>true</secure>

在 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>

当我们删除

<secure>true</secure>

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

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

问候

4

1 回答 1

2

根据HTTP 规范

安全的

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

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

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

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

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

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

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

但是,即使您使用的HTTPS,“安全”也浏览器的安全概念相关,例如:

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

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

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

我能够使用 TLS 和您的web.xml配置配置 JBoss 6.1.0 Final,并且一切都按预期工作。

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

于 2014-08-16T04:06:52.290 回答