【发布时间】:2023-04-04 07:15:01
【问题描述】:
我有一个关于 java 中的 ssl 客户端的问题。 在浏览器的情况下,客户端 hello 请求启动时包含它支持的密码套件、版本号等,并且服务器以具有将用于此会话的密码套件的服务器 hello 进行响应。
我认为此时会创建一个会话 (jsessionId)(服务器 hello),如果客户端 hello 中不存在会话(这意味着 jsessionId 被发送到未受保护的客户端(?))
此过程完成后,浏览器会根据需要发出 https 请求,并且浏览器会使用服务器 hello 中返回的密码套件中提到的加密算法对其进行加密。
如果我必须在 java 中执行此操作,我可以使用 SSLSocket 进行握手并在 addHandshakeCompletedListener 方法中关联一个处理程序。
所以,一旦握手完成,控制权就交给addHandshakeCompletedListener回调方法。
所以,如果现在我需要发出 ssl 请求,我将不得不使用 HttpsURLConnection (?) 并创建一个请求。
我的问题是 - HttpsURLConnection 如何知道加密算法然后使用它进行加密?
我可以自己使用密码套件中的加密算法对其进行加密,然后通过正常的 http 连接 (HttpURLConnection (?)) 发布它。它会起作用吗?
我知道这是一个复杂的结构 - 我们必须计算 mac,然后在加密数据之前附加。 HttpsURLConnection 会做这一切吗?
会话如何维护? HttpsURLConnection怎么知道这个连接已经发起,握手过程已经完成?
我无法关联所有这些?任何帮助,将不胜感激!如果可能,请举例说明。
【问题讨论】:
-
jsessionID 是上层实体,超出 ssl 握手(服务器问候)。它在 http(s) 层但不在套接字层 (ssl)
-
您的标题是“用 Java 模拟 SSL 客户端”。这是什么意思?为什么要模拟 Java 已经可以做的事情?