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

| 我对SSL / TLS协议和OpenSSL库的经验非常有限。从本质上讲,我本周开始学习它,但是我为迄今为止所学到的知识而感到自豪。 我确实有一个挥之不去的问题,还没有找到答案。我已经尝试使用Google搜索,并寻找其他可用的资源,但似乎我不知道如何正确地问我的问题。它与握手过程有关,如果客户端已经具有服务器证书,该怎么办? 我了解握手的最初部分涉及以下高级步骤: 客户端发送问候消息 服务器以自己的问候消息响应 服务器发送证书 客户端验证服务器证书 服务器发送表明协商已完成的消息 我只是似乎无法弄清楚当客户端已经具有服务器证书时此过程如何工作。我知道会话ID可用于执行恢复的握手,其中只发送问候消息,然后在消息加密后再显示一条说明任何数据的消息,从而避免了非对称握手中的密钥生成。但是对我来说,使用这些会话ID似乎不是一个好主意,因为从本质上讲,它们将不得不持续很长时间,这可能会带来安全问题(我不知道怎么做,但是拥有一个长期存在的会话ID。也许我是错的)。我认为该行为可能与网络浏览器的行为相似,但是未能找到关于该途径的任何信息。 我去看了一下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来保存服务器证书吗? 感谢您阅读我的文章。感谢您可能提供的任何帮助/指导/指标。如果我的问题/想法不清楚,请告诉我,我会尽力澄清。     
已邀请:
        您似乎正在将缓存证书(\“客户端已具有服务器证书\”)与缓存连接状态(\“避免非对称握手中的密钥生成\”)混为一谈。 缓存服务器证书当然没有安全问题。证书的获取完全无关紧要,因为该证书完全是公共信息。其目的是向您传达服务器的公钥。密钥协商仅在服务器具有相应的私钥时才有效,无论您如何获取证书。 但是,我不知道OpenSSL API(或SSL协议)是否允许您假设您已经拥有服务器的证书并跳过了握手的那一部分。如您所知,SSL_CTX_use_certificate_file()是您在客户端上调用以标识客户端证书的内容。这就是Web服务器调用以标识其自己的服务器证书的方式。它不是用于标识客户端上的服务器证书,反之亦然。 至于重新使用现有的会话ID(以完全跳过密钥生成),这也很安全。至少,这不比拥有长期的SSL连接差。而且,如果有人发现了问题,那么该结果将值得获得博士学位。至少。 [关于恢复会话的更新] RFC 5246的7.3节概述了SSL握手,包括恢复会话的情况。恢复会话意味着您可以跳过交换和验证证书,而直接跳入加密的会话,首先从ChangeCipherSpec消息开始以协商密钥。 顺便说一句,我认为在实践中恢复SSL会话并不普遍。握手并没有那么慢,并且保持状态很烦人。据我所知,Web浏览器和服务器通常不使用此功能。他们只是在每个SSL连接上进行完整的握手。     

要回复问题请先登录注册