我对SSL/TLS协议和OpenSSL库的经验非常有限。实际上,我是在本周开始学习它的,但我为自己迄今为止学到的知识量感到自豪。
然而,我仍有一个悬而未决的问题,并且一直没有找到答案。我已经尝试过谷歌搜索和其他可用资源,但似乎我不知道如何正确地提问我的问题。这与握手过程有关,如果客户端已经拥有服务器证书会发生什么?
我了解到握手的初始部分涉及以下高级步骤:
- 客户端发送hello消息
- 服务器响应其自己的hello消息
- 服务器发送证书
- 客户端验证服务器证书
- 服务器发送消息指示协商完成
我只是无法弄清楚当客户端已经拥有服务器证书时,此过程将如何工作。我知道可以使用会话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来保存服务器证书吧?
感谢阅读我的帖子。我感激您提供的任何帮助/指导/指针。如果我的问题/想法不清楚,请告诉我,我会尽力澄清。