Java客户端SSL握手

Java客户端SSL握手

问题描述:

我在SSL握手中有一个非常基本的疑问。假设我们有一个使用自签名证书的服务器S.我编写一个连接到S的Java客户端C.当C连接到S时,C从S获得证书并将它们保存到它的信任库,并且通信的其余部分继续。一段时间后,我使用相同的C连接到S,所以S将证书再次发送给C,否则C将使用已存储在信任库中的证书。我不擅长SSL中的Java和Truststore功能的底层实现。Java客户端SSL握手

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

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

在此先感谢。

+1

我在java中编写了一个https模拟器。我能够使用自签名证书在15秒内模拟12000-15000个请求。但是使用CA证书需要3分钟?我真的不明白为什么会发生这种情况。处理自签名和CA证书有什么细微差别? – JKV 2010-04-26 11:26:24

这是我对SSL的理解,我不是这方面的专家,但是在没有其他答案的情况下,我希望至少能给你一些想法。

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

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

会议behvaiour有某种形式发生,允许进行通信而无需每次交换证书。但我相信这仅限于单一连接,因此,只要关闭连接并创建新连接,就必须重复该过程,即服务器必须重新发送证书以进行验证。

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

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

希望这至少给你一些想法。

+0

这很不错。恢复能力不受连接限制;它通常只是会话有一定的生命周期的问题,通常是五分钟,在此期间,相同SSL对等体之间的新SSL连接可以重用开始时生成的主密钥。 – 2010-04-24 00:55:06

+0

我用java编写了一个https模拟器。我能够使用自签名证书在15秒内模拟12000-15000个请求。但是使用CA证书需要3分钟?我真的不明白为什么会发生这种情况。处理自签名和CA证书有什么细微差别? – JKV 2010-04-26 11:28:47

+1

我不认为他们的处理方式有任何不同,但是证书本身可能存在差异。也许自签名证书中使用的密钥大小比CA证书短? CA证书可能有一长串证书,因此为了验证客户端证书,它必须查看更长的可信证书列表。 我认为有办法看openssl这些东西。 – DaveJohnston 2010-04-27 08:58:03