我使用SSL / TLS协议和OpenSSL库的经验非常有限。基本上我本周开始学习它,但我为迄今为止学到的知识量感到自豪。
我确实有一个挥之不去的问题,但未能找到答案。我已经尝试使用谷歌搜索并查看可用的其他资源,但似乎我不知道如何正确地提出我的问题。它与握手程序有关,如果客户端已经拥有服务器证书会发生什么?
我理解握手的初始部分涉及这些高级步骤:
当客户端已经拥有服务器证书时,我似乎无法弄清楚这个过程是如何工作的。我知道会话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来保存服务器证书吗?
感谢您阅读我的帖子。我感谢您提供的任何帮助/指导/指示。如果我的问题/想法不明确,请告诉我,我会尽力澄清它们。
答案 0 :(得分:3)
您似乎将缓存证书(“客户端已具有服务器证书”)与高速缓存连接状态(“避免非对称握手中的密钥生成”)混为一谈。
缓存服务器证书肯定没有安全问题。你如何获得证书并不重要,因为它完全是公共信息;其目的是向您传达服务器的公钥。只有在服务器具有相应的私钥时,密钥协商才有效,无论您如何获得证书。
但是,我不知道OpenSSL API(或SSL协议)是否允许您假设您已拥有服务器的证书并跳过该部分握手。正如您已经想到的那样,SSL_CTX_use_certificate_file()是您在客户端上调用以识别客户端证书的内容。它是Web服务器调用以识别自己的服务器证书的内容。它不是用于识别客户端上的服务器证书,反之亦然。
至于重用现有的会话ID(完全跳过密钥生成),这也是很安全的。至少,它不比拥有长期SSL连接更糟糕。如果有人发现问题,那么结果将值得博士学位。至少。
[恢复会话时更新]
Section 7.3 of RFC 5246概述了SSL握手,包括恢复会话的情况。恢复会话意味着您可以跳过交换和验证证书并直接跳转到加密会话,从ChangeCipherSpec消息开始协商密钥。
顺便说一句,我认为在实践中恢复SSL会话并不常见。握手不是 慢,保持状态很烦人。据我所知,Web浏览器和服务器通常不使用此功能;他们只是在每个SSL连接上进行完全握手。