Java客户端上的SSL HandShake

时间:2010-04-23 13:21:03

标签: java ssl ssl-certificate

我对SSL HandShake有一个非常基本的疑问。假设我们有一个使用自签名证书的服务器S.我编写了一个连接到S的Java客户端C.当C连接到S时,C从S获取证书并将它们保存到信任库,并继续进行通信的剩余部分。一段时间后,我使用相同的C连接到S,因此S将再次将证书发送到C,或者C将使用已存储在truststore中的证书。我不擅长SSL中的SSL和Truststore功能的底层实现。

将S发送证书给C不变,C是否在其信任库上有证书?我相信,如果我在信任库中有证书C信任S和C在我再次连接时不会要求证书?我的假设是对的吗?

自签名证书和CA证书的流程是否相同?

提前致谢。

1 个答案:

答案 0 :(得分:6)

这是我对SSL的理解,我不是该主题的专家,但在没有其他答案的情况下,希望我至少能给你一些思考的东西。

当您为服务器创建自签名证书时,您需要以某种方式将其添加到客户端,它不会在客户端连接后立即安装,否则任何服务器都可以通过发送自签名证书来信任任何试图连接它的东西。在我的应用程序中,服务器证书在启动时通过指定javax.net.ssl.truststore(“path / to / server / cert”)加载到客户端的信任库中;

现在,当客户端连接到服务器时,会发生握手。此时,服务器将其证书发送给客户端,客户端将通过对其信任库进行检查来确认它实际上来自服务器(此时无论是否自签,都无关紧要,因为客户端应该检查根证书以及您添加的任何证书。如果服务器发送的证书检出通信继续并且共享数据。

有一种形式的会话behvaiour允许通信继续进行,而不必每次都交换证书。但我相信这仅限于单一连接,因此只要您关闭连接并创建一个新连接,就必须重复该过程,即服务器必须再次发送其证书进行验证。

总而言之:自签名服务器证书必须在SSL通信之外安装在客户端上(例如从一开始就如何在产品中安装根CA证书)。 客户端和服务器之间建立的每个SSL连接都要求服务器将其证书发送到客户端,以便它可以根据其信任库进行检查。

服务器可能会允许恢复会话,在这种情况下,证书不会被重新发送(但我不确定在什么条件下可以恢复会话,也许可以在不同的服务器上配置)。

希望这至少能让你有所思考。