[英]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.