我使用以下代码来为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不存在呢?另外,我可以使用广泛部署的TLS1,但如果服务器支持1.1或1.2,则我的代码将不会使用更新的版本,除非像上面那样使用。
我希望进行以下初始化:
- 兼容所有服务器,无论它们使用v3、tls1、tls1.1还是tls1.2。 - 自动使用最新版本,并在服务器上不可用时使用较低版本,但不低于版本3——如果版本低于3,则失败/异常。 - 我认为第一个代码版本会实现这一目标,但它报告了版本错误。是否可能实现上述目标,或者必须提供用户设置来选择要使用的SSL版本?
STARTTLS
的SMTP也比没有加密更好,因为机会主义加密比没有加密更好(我不赞成SSLv2)。然而,IMAPS或POP3S应该使用TLSv1及以上版本,因为客户端将使用这些协议来检查电子邮件和管理邮箱。 - jww