如果客户端已经拥有服务器证书,SSL握手/协议如何工作?

4

我对SSL/TLS协议和OpenSSL库的经验非常有限。实际上,我是在本周开始学习它的,但我为自己迄今为止学到的知识量感到自豪。

然而,我仍有一个悬而未决的问题,并且一直没有找到答案。我已经尝试过谷歌搜索和其他可用资源,但似乎我不知道如何正确地提问我的问题。这与握手过程有关,如果客户端已经拥有服务器证书会发生什么?

我了解到握手的初始部分涉及以下高级步骤:

  1. 客户端发送hello消息
  2. 服务器响应其自己的hello消息
  3. 服务器发送证书
  4. 客户端验证服务器证书
  5. 服务器发送消息指示协商完成

我只是无法弄清楚当客户端已经拥有服务器证书时,此过程将如何工作。我知道可以使用会话ID进行恢复握手,其中仅发送hello消息,然后发送一个消息,说明此消息之后的任何数据都将被加密,从而避免在非对称握手中生成密钥。但是使用这些会话ID似乎不是一个好主意,因为它们必须持续很长时间,这可能会带来安全问题(我不知道如何,但长时间持久的会话ID似乎不好。也许我错了)。我想到行为可能类似于Web浏览器,但未能在那方面找到任何信息。

我查看了OpenSSL API以进行一些研究,但仍有悬而未决的问题。API方法:

int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type);

当我初始化/设置所有我的OpenSSL结构时,我认为这将是服务器证书文件(如果已存在)。但我进行了进一步的研究,它可以用于客户端和服务器应用程序。那么,在我作为客户端并且尚未拥有服务器证书的情况下,我是否会在调用SSL_connect() API执行SSL握手之前放弃使用上述API方法?我想,如果是这种情况,我会以某种方式使用OpenSSL API来保存服务器证书吧?
感谢阅读我的帖子。我感激您提供的任何帮助/指导/指针。如果我的问题/想法不清楚,请告诉我,我会尽力澄清。

证书只是方程式的一部分。拥有证书并不能让恢复会话成为可能。关键的交换和会话密钥才能让您稍后恢复会话。 - Eugene Mayevski 'Callback
是的。因此,会话 ID 用于恢复连接。也许更好的说法是,通过缓存服务器证书是否有一些性能/时间/资源上的收益?我只是在浏览器中到处看到它们,并试图弄清楚这些收益来自哪里,如果有的话。还有如何在客户端应用程序中“实现”它们,如果证书已经被缓存。 - Chris
2
缓存服务器证书没有意义,因为服务器无论如何都会发送它。有时,服务器证书会在客户端上作为受信任的存储,以省略CRL / OCSP检查,或者当证书是自签名的或以其他方式不可验证时。但这与握手本身无关。Nemo更详细地描述了该过程。 - Eugene Mayevski 'Callback
1个回答

4
你似乎将缓存证书(“客户端已经拥有服务器证书”)与缓存连接状态(“避免在非对称握手中生成密钥”)混淆了。
缓存服务器证书肯定不会存在安全问题。无论您如何获取该证书,因为它是完全公开的信息;其目的是向您传递服务器的公钥。无论您如何获取证书,密钥协商只有在服务器拥有相应的私钥时才能起作用。
但是,我不知道OpenSSL API(或SSL协议)是否允许您假定您已经拥有服务器的证书并跳过握手的这一部分。正如您已经发现的那样,SSL_CTX_use_certificate_file()是客户端调用以识别客户端证书的函数。Web服务器将调用它以识别自己的服务器证书。它不是用于标识客户端或反之亦然的服务器证书。
至于重用现有会话ID(以完全跳过密钥生成),那也是非常安全的。至少,它不比具有长期有效的SSL连接更糟糕。如果有人发现了问题,结果至少值得一个博士学位。
[关于恢复会话的更新]

RFC 5246第7.3节概述了SSL握手过程,包括恢复会话的情况。恢复会话意味着您可以跳过交换和验证证书,直接进入加密会话,并从ChangeCipherSpec消息开始协商密钥。

顺便说一句,在实践中,我认为恢复SSL会话并不常见。握手并不是那么慢,而且保留状态很麻烦。据我所知,Web浏览器和服务器通常不使用此功能;它们只在每个SSL连接上执行完整的握手。


感谢您的回复。所以如果我理解正确,即使使用会话 ID 来恢复连接,证书仍然会被交换?唯一不会发生的部分是密钥生成吗?或许还有其他方面可以帮助我。相比于密钥生成,交换证书和验证它们需要的时间/资源是否微不足道? - Chris
我添加了一个更新。慢的部分是公钥加密,即验证证书链和生成“主密钥”(由客户端和服务器共享)。主密钥是您在恢复会话时重复使用的状态的一部分。(在现代系统上,即使是“慢的部分”,也可能不是非常慢的。) - Nemo
2
通常情况下,至少在使用Apache时,会使用SSL会话恢复。请参见“SSLSessionCache”指令。 - caf
@caf:我改正了。顺便问一下,您知道哪些浏览器支持它吗? - Nemo
1
不是详尽无遗的,但火狐和谷歌浏览器肯定支持。 - caf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接