在java

时间:2016-04-13 17:07:01

标签: java ssl

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

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

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

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

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

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

我的问题是 - HttpsURLConnection如何了解加密算法然后使用加密算法进行加密?

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

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

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

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

2 个答案:

答案 0 :(得分:1)

  

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

正确。

  

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

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

  

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

正确。

  

如果我必须在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来执行此操作。

  

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

太宽了。

答案 1 :(得分:-1)

  

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

     

我的问题是 - HttpsURLConnection如何了解加密   算法然后用它加密?

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

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

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

  

如何维护会话? HttpsURLConnection如何知道这一点   连接已经启动并且握手程序具有   已经完成了?

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

从点到点传输数据

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

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