【发布时间】: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。