gpt4 book ai didi

openssl - 如何使 Indy OpenSSL 与大多数服务器兼容

转载 作者:行者123 更新时间:2023-12-02 21:13:38 48 4
gpt4 key购买 nike

我使用以下代码为 POP3/SMTP 发送/接收应用程序设置 SSLHandler:

IdSSLHandler->SSLOptions->Mode        = sslmClient;
IdSSLHandler->SSLOptions->Method = slvSSLv23;
IdSSLHandler->SSLOptions->SSLVersions = TIdSSLVersions() << sslvSSLv3 << sslvTLSv1 << sslvTLSv1_1 << sslvTLSv1_2;

因此,上述代码应该自动支持 SSL 3、TLS 1、TLS 1.1 和 TLS 1.2。这不能很好地工作并报告“错误版本”错误。当 SSLVersions 行被删除时,它可以工作,但默认情况下它包含我不想支持的 sslvSSLv2 。它是一样的:

IdSSLHandler->SSLOptions->Mode        = sslmClient;
IdSSLHandler->SSLOptions->Method = slvSSLv23;
IdSSLHandler->SSLOptions->SSLVersions = TIdSSLVersions() << sslvSSLv2 << sslvSSLv3 << sslvTLSv1 << sslvTLSv1_1 << sslvTLSv1_2;

出于某种原因,这可以工作,而上面的方法不能在同一服务器上。我知道 slvSSLv23 是一种“使用任何可用版本”值。那么为什么它不适用于上面不存在版本 2 的代码呢?

此外,我可以使用似乎已广泛部署的 TSL1,但如果服务器支持 1.1 或 1.2,那么我的代码将不会使用更新的版本,而是会强制使用 1.0 版本,除非使用类似上面的内容。

我想通过以下目标进行初始化:

  • 与所有服务器兼容,无论它们使用 v3、tls1、tls1.1 还是 tls1.2
  • 自动使用最新版本,如果服务器上没有最新版本但不低于版本 3,则自动使用较低版本 - 如果版本低于 3,则失败/异常

我认为代码的第一个版本会提供该功能,但它报告版本错误。上述目标是否可行,或者必须提供用户设置来选择要使用的 SSL 版本?

最佳答案

SSLVersions 设置为单个值会自动将Method 设置为相应的单个版本。将 SSLVersions 设置为多个值会自动将 Method 设置为 slvSSLv23

Method 设置为单个版本会自动将SSLVersions 设置为相应的单个值。将Method 设置为slvSSLv23 会自动将SSLVersions 设置为所有支持的值。

Indy 根据 MethodSSLVersions< 的值激活/停用 OpenSSL 中相应的 SSL_OP_NO_SSL_v#SSL_OP_NO_TLS_v# 标志.

我建议采用以下方法,随着新 TLS 版本的添加,这种方法更具前瞻性:

IdSSLHandler->SSLOptions->Method      = sslvSSLv23;
IdSSLHandler->SSLOptions->SSLVersions = IdSSLHandler->SSLOptions->SSLVersions >> sslvSSLv2;

无论哪种方式,Indy 都将使用 SSLv23,并且仅激活 SSL_OP_NO_SSL_v2 标志。

在该配置中,“错误版本”错误通常意味着服务器正在使用不支持版本协商的特定版本(使用 SSLv2 兼容的客户端 hello)。换句话说,SSLv23 客户端连接到 TLSv1 服务器将会失败。服务器必须使用 SSLv23 才能支持版本协商。在服务器上使用 SSLv23 允许它接受任何版本的客户端,因为客户端发起握手,因此服务器可以看到正在使用哪个版本 header 。但在客户端上使用 SSLv23 不允许其连接到 SSLv23 服务器以外的任何服务器。 SSLv2 服务器只能接受 SSLv2 客户端,SSLv3 服务器只能接受 SSLv3 客户端,TLSv1 服务器只能接受 TLSv1 客户端,依此类推。

要真正连接到“任何”服务器,您必须检测“版本错误”错误,并使用不同的特定 Method/SSLVersions 配置重试。不幸的是,“错误版本”回复不包括服务器的实际版本,因此您必须使用试错法。如果 SSLv23 失败,请尝试 TLSv1_2。如果失败,请尝试 TLSv1_1。如果失败,请尝试 TLSv1。如果失败,请尝试 SSLv3。

关于openssl - 如何使 Indy OpenSSL 与大多数服务器兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22101816/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com