首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JSSE SSLEngine的SSL会话管理

使用JSSE SSLEngine的SSL会话管理
EN

Stack Overflow用户
提问于 2012-03-13 14:54:44
回答 1查看 1.4K关注 0票数 1

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

我正在使用Firefox 10测试我的web服务器。在最初的页面加载中,一切都很好。握手成功完成。服务器处理客户端请求并发回响应。响应非常清晰,浏览器加载应用程序数据(html、图像等)。下面是从客户机发送到服务器的消息的快照。

页面请求#1

代码语言:javascript
复制
===============================================
== 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将发送应用程序记录,而不是客户机hello。

页面请求#2

代码语言:javascript
复制
===============================================
== Application Data
===============================================
Client Request:
    application_data (23)
     *** Encrypted Message ****

在这种情况下,当SSLEngine试图打开应用程序数据时,它会抛出一个异常。

代码语言:javascript
复制
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?

我相信这是因为我正在用每个页面请求实例化一个新的SSLEngine。如果我只实例化SSLEngine一次并使它成为一个全局/静态变量,它将成功地打开应用程序记录,并且我可以向客户机发送一个响应。我可以刷新页面,访问其他页面等,没有任何问题。页面加载非常快,因为我们跳过了整个ssl握手过程。

不幸的是,如果在所有这些操作(例如IE或Safari)进行时,我从不同的浏览器访问web服务器,SSLEngine中的会话状态就会被关闭,并且我的web服务器无法响应任何新的SSL请求。因此,实例化一次SSLEngine并使其成为一个全局可访问的静态变量似乎不是一个可行的选项。所以..。

我到底应该如何回应第二个页面请求(页面请求#2)?是否有方法将第二个页面请求(Page #2)与初始握手请求(Page #1)绑定,而不是IP地址?第二个页面请求(Page #2)中的应用程序数据中是否有SSL会话ID?

提前谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-14 02:10:00

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9686503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档