【问题标题】:SSL Session Management with JSSE SSLEngine使用 JSSE SSLEngine 进行 SSL 会话管理
【发布时间】:2012-03-29 23:59:33
【问题描述】:

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

我正在使用 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 内的会话状态会被破坏,我的 Web 服务器无法响应任何新的 SSL 请求。因此,一次实例化 SSLEngine 并使其成为全局可访问的静态变量似乎不是一个可行的选择。所以...

我到底应该如何响应第二个页面请求(页面请求 #2)?除了 IP 地址之外,还有其他方法可以将第二个页面请求(页面请求 #2)与初始握手请求(页面请求 #1)联系起来吗?在第二个页面请求(页面请求 #2)中的应用程序数据中是否存在 SSL 会话 ID?

提前致谢!

【问题讨论】:

    标签: java ssl jsse sslengine


    【解决方案1】:

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

    【讨论】:

    • 是的,当然!我可以将第二个请求绑定到第一个请求,因为消息使用相同的套接字连接。我不敢相信我之前没有想到这一点。再次感谢 EJP!
    猜你喜欢
    • 2012-05-23
    • 2012-04-29
    • 1970-01-01
    • 2016-02-07
    • 2012-12-15
    • 2013-12-18
    • 1970-01-01
    • 2016-04-26
    相关资源
    最近更新 更多