java - 使用 JSSE SSLEngine 进行 SSL session 管理

标签 java ssl jsse sslengine

我正在研究 SSL web server using NIO and the SSLEngine .我能够成功处理握手和发送/接收应用程序数据。但是,我很难理解如何维护 SSL session 状态。

我正在使用 Firefox 10 测试我的网络服务器。在初始页面加载时,一切都很好。握手成功完成。服务器处理客户端请求并发回响应。响应干净利落,浏览器加载应用程序数据(html、图像等)。这是从客户端发送到服务器的消息的快照。

页面请求#1

===============================================
== Message 1
===============================================
Client Request:
    handshake (22)
     - client_hello (1)

Server Response:
    handshake (22)
     - server_hello (2)
     - certificate (11)
     - server_key_exchange (12)
     - certificate_request (13)
     - server_hello_done (14)

===============================================
== Message 2
===============================================
Client Request:
    handshake (22)
     - certificate (11)
     - client_key_exchange (16)

    change_cipher_spec (20)
     - client_hello (1)

    handshake (22)
     *** Encrypted Message ****

===============================================
== Message 3
===============================================
Client Request:
    application_data (23)
     *** Encrypted Message ****

    application_data (23)
     *** Encrypted Message ****

Server Response:
    application_data (23)
     *** Encrypted Message ****

同样,在初始页面加载时,一切正常。但是,如果我刷新浏览器或转到另一个“页面”,Firefox 会发送应用程序记录而不是客户端问候。

页面请求#2

===============================================
== Application Data
===============================================
Client Request:
    application_data (23)
     *** Encrypted Message ****

在这种情况下,SSLEngine 在尝试解包应用程序数据时抛出异常。

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?

我相信这是因为我在每个页面请求中都实例化了一个新的 SSLEngine。如果我只实例化 SSLEngine 一次并将其设为全局/静态变量,它会成功解包应用程序记录并且我可以将响应发送回客户端。我可以毫无问题地刷新页面、访问其他页面等。页面加载非常快,因为我们跳过了整个 SSL 握手过程。

不幸的是,如果我在所有这一切进行时从不同的浏览器(例如 IE 或 Safari)访问 Web 服务器,SSLEngine 内的 session 状态将被清除,并且我的 Web 服务器无法响应任何新的 SSL 请求。因此,一次实例化 SSLEngine 并使其成为全局可访问的静态变量似乎不是一个可行的选择。所以……

我到底应该如何响应第二个页面请求(Page Request #2)?有没有办法将第二个页面请求(Page Request #2)与 IP 地址以外的初始握手请求(Page Request #1)联系起来?第二页请求(Page Request #2)中的应用程序数据中是否隐藏了 SSL session ID?

提前致谢!

最佳答案

您必须实例化一个新的 SSLEngine 每个 SocketChannel,而不是每个请求、每个页面或每个应用程序。 SSLEngine 一次只知道一个 SSL 连接的状态。

关于java - 使用 JSSE SSLEngine 进行 SSL session 管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9686503/

相关文章:

Certificate Authority 不在 JRE 时的 Java SSL 连接解决方​​案

java - 是否可以在单个应用程序中处理客户端和浏览器连接?

java - 带有嵌入式服务器的 JAX-RS

java - 无法使用java执行mongo db聚合查询,

apache - 在我的网站上使用 https 时出现警告

javascript - Ajax 调用 CORS 禁用服务

visual-studio - 在 Visual Studio 2013 上启用 SSL 不起作用

javax.net.ssl.SSLException : java. security.InvalidAlgorithmParameterException: trustAnchors 参数必须是非空的

tomcat - 如何将 OpenSSL 的密码列表映射到 Java JSSE

java - JAVA多线程同步