我有一个C应用程序。我想根据我的接收者使用的openssl版本来区分我的发送者。我有一个使用openssl 1.0.2,另一个使用openssl 3.0.5。有什么方法可以让我知道我的同伴正在使用的openssl的版本吗?
SSL结构的client_version变量为两者提供相同的值。
从我的评论中添加到这里。
所以,实际上我的旧代码有一些问题(我没有写)。它在执行SSL_shutdown之前执行SSL_free和SSL_CTX_free。现在,这在旧版本的OpenSSL 1.0.2中工作得很好。但是,一旦我将应用程序迁移到3.0.5,我必须执行SSL_shutdown以使通信正常工作。现在,因为我正在做SSL_shutdown,我无法使用1.0.2 ssl与发送方通信。因此,我想知道发送方的ssl版本,然后为我的接收器执行SSL_shutdown,以便与使用任何版本的ssl的发送方正常工作。我不能修改我的旧代码。
我拥有发送方和接收方。我知道他们使用OpenSSL。我想为我的应用程序的新版本实现向后兼容,它将使用OpenSSL 3.0。
检测对等体TLS库的版本不是实现TLS层向后兼容性的方式。相反,您的服务器应该期望支持特定的TLS协议版本和密码。
OpenSSL 1.0.2支持TLS 1.2——OpenSSL 3.0也支持TLS 1.2(它也支持TLS 1.3)。此外,OpenSSL 1.0.2和OpenSSL 3.0在支持的密码方面也有很多重叠之处——关于1.0.2和3.0,请参见这里。请注意,实际支持的密码和协议版本也取决于应用程序及其配置,但如果您控制了两者,则应该可以匹配。
(从评论)所以,实际上我的旧代码有一些问题(我没有写). ...所以,我想知道发送方的ssl版本,然后为我的接收方执行SSL_shutdown,以便使用任何版本的ssl与发送方正常工作。
基于此,您的实际需求不是获得TLS库的确切版本,而是仅区分使用OpenSSL 1.0.2和使用OpenSSL 3.0的客户端,并且仅在TLS握手完成之后。这个要求比实际检测TLS版本要简单得多:使用正确配置的OpenSSL 3.0客户端,您应该能够获得TLS 1.3,而使用OpenSSL 1.0.2,您只能获得TLS 1.2。获取已建立TLS会话的TLS版本可以通过调用SSL_get_version来完成。