【问题标题】:How to make Indy OpenSSL compatible with most servers如何使 Indy OpenSSL 与大多数服务器兼容
【发布时间】:2014-04-01 20:21:09
【问题描述】:

我使用以下代码为 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 版本?

【问题讨论】:

  • 当您说“邮件”时,您指的是什么协议?带有STARTTLS 的 SMTP 即使使用 SSLv2 也会受益,因为机会加密比不加密要好(而且我不容忍 SSLv2)。但是,IMAPS 或 POP3S 应使用 TLSv1 及更高版本,因为客户端将使用这些协议来检查电子邮件和管理邮箱。
  • 我明白,但我仍然想避免使用 SSL v2,因为它已经过时了,此外,没有多少服务器在使用它(我希望)。我已经更新了问题 - 它是 POP3 和 SMTP。问题是上面的代码不允许我似乎避免使用 v2。

标签: openssl indy indy10


【解决方案1】:

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)。换句话说,连接到 TLSv1 服务器的 SSLv23 客户端将失败。服务器必须使用 SSLv23 才能支持版本协商。在服务器上使用 SSLv23 允许它接受任何版本的客户端,因为客户端启动握手,因此服务器可以看到正在使用的版本标头。但是在客户端上使用 SSLv23 不允许它连接到除 SSLv23 服务器之外的任何服务器。 SSLv2 服务器只能接受 SSLv2 客户端,SSLv3 服务器只能接受 SSLv3 客户端,TLSv1 服务器只能接受 TLSv1 客户端,依此类推。

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

【讨论】:

    猜你喜欢
    • 2020-02-04
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 2011-01-28
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    相关资源
    最近更新 更多