繁体   English   中英

在java中模拟SSL客户端

[英]Simulate a SSL client in java

我对java中的ssl客户端有疑问。 在浏览器的情况下,启动客户端问候请求,其具有它支持的密码套件,版本号等,并且服务器响应具有将用于该会话的密码套件的服务器问候。

我认为会话( jsessionId )是在此时创建的(服务器问候),如果客户端问候中没有(这意味着jsessionId被发送到客户端不受保护(?))

完成此过程后,浏览器会根据需要发出https请求,并使用服务器hello中返回的密码套件中提到的加密算法对浏览器进行加密。

如果我必须在java中执行它,我可以使用SSLSocket进行握手并在addHandshakeCompletedListener方法中关联处理程序。

因此,一旦握手完成,控制就会出现addHandshakeCompletedListener回调方法。

所以,如果现在我需要发出ssl请求,我将不得不使用HttpsURLConnection (?)并创建一个请求。

我的问题是 - HttpsURLConnection如何知道加密算法,然后使用它加密?

我可以使用密码套件中的加密算法自己对其进行加密,并通过普通的http连接( HttpURLConnection (?))发布。 它会起作用吗?

我知道这是一个复杂的结构 - 我们必须计算mac然后在加密数据之前追加。 HttpsURLConnection做到这一切吗?

如何保持会话? HttpsURLConnection如何知道此连接已经启动并且握手程序已经完成?

我无法将所有这些联系起来? 任何帮助,将不胜感激! 如果可能请提供一个示例来解释。

我对java中的ssl客户端有疑问。 在浏览器的情况下,启动客户端问候请求,其具有它支持的密码套件,版本号等,并且服务器响应具有将用于该会话的密码套件的服务器问候。

正确。

我认为会话(jsessionId)是在此时创建的(服务器问候),如果客户端问候中没有(这意味着jsessionId被发送到客户端不受保护(?))

不是。这是HTTPS的一部分,而不是SSL,它发生在SSL握手完成之后。

完成此过程后,浏览器会根据需要发出https请求,并使用服务器hello中返回的密码套件中提到的加密算法对浏览器进行加密。

正确。

如果我必须在java中执行它,我可以使用SSLSocket进行握手并在addHandshakeCompletedListener方法中关联处理程序。

如果你必须用Java做HTTPS,你只需要一个HttpsURLConnection 您也不需要SSLSocket

因此,一旦握手完成,控制就会出现addHandshakeCompletedListener回调方法。

这仅仅是为了验证对等身份,并且在HttpsURLConnection中不会发生。

所以,如果现在我需要发出ssl请求,我将不得不使用HttpsURLConnection(?)并创建一个请求。

这是你应该开始的地方。 高于这一点的一切都与你无关。

我的问题是 - HttpsURLConnection如何知道加密算法,然后使用它加密?

它没有。 它在内部使用SSLSocket来完成所有这些工作。

我可以使用密码套件中的加密算法自己对其进行加密,并通过普通的http连接(HttpURLConnection(?))发布。 它会起作用吗?

不,不。 这些都不是必要的。 这一切都是为你完成的。

我知道这是一个复杂的结构 - 我们必须计算mac然后在加密数据之前追加。 HttpsURLConnection能做到这一切吗?

不, SSLSocket做到了。

如何保持会话?

哪个会话? 有两种:SSL会话和HTTPS会话。 SSL会话由底层SSLContext维护,服务器通过jsessionid cookie进行HTTPS会话。

HttpsURLConnection如何知道此连接已经启动并且握手程序已经完成?

因为它使用SSLSocket来做到这一点。

我无法将所有这些联系起来? 任何帮助,将不胜感激! 如果可能请提供一个示例来解释。

太宽泛。

所以,如果现在我需要发出ssl请求,我将不得不使用HttpsURLConnection(?)并创建一个请求。

我的问题是 - HttpsURLConnection如何知道加密算法,然后使用它加密?

是的,你必须使用HttpsURLConnection。 但你不必明确地这样做。 new URL("https://google.pl").openConnection(); 就足够了。

在Server Hello中,服务器会响应它可以接受的加密。 所有加密方法都必须“宣布”自己,以便服务器知道如何解释它们。 因此,当您启动连接时,服务器会说明它可以处理的内容,客户端选择其中一个cipers并使用它来捕获数据。 在连接开始时,客户端宣布它将使用哪个套件。

此信息可以是公开的,这不是以明文形式发送的问题。 关键是,要以私密方式在服务器中的客户端之间交换对称密钥,因此其余的通信可以加密密钥。

如何保持会话? HttpsURLConnection如何知道此连接已经启动并且握手程序已经完成?

SSL代表安全套接字层。 这意味着数据发送和接收被加密,在原始套接字(流)级别上解密; 您可以打开SSL连接,不仅通过Https从点到点传输数据

没有“会话”。 只要你打开一个连接,就有2个流。 输入和输出。 只要这些是开放的,您就可以写入数据或从中读取数据。 一旦关闭,您将不得不启动另一个连接。

每个Http请求都是一个新连接(除非发送Keep-Alive)。 例如,JsessionId或者php的sessionid是为了识别你是早先发出请求的同一个客户端,因此它可以“模拟”持续连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM