Delphi w Indy 10 : Unable to connect via TLS 1. 2 w SSL "Best Practices"在网络服务器上就位

标签 delphi http ssl indy

问题:我们如何让 Indy 10 与执行最新 TLS 1.2 SSL 最佳实践的网络服务器一起工作?

Microsoft 记录了最佳实践: https://technet.microsoft.com/library/security/ms12-006本质上,跨多个 TLS 版本使用的大量密码被认为是不安全的。请注意,此知识库来自 2013 年年中,远早于 Poodle 。

作为最佳实践,Delphi 社区中有一些与 BEAST 攻击相关的文章,其中还建议禁用基于 CBC 的密码 (http://www.atozedsoftware.com/Intraweb/Blog/20120905.EN.aspx)

最佳实践总结:主要的 SSL 漏洞包括 BEAST 和 POODLE 攻击。这里的场景并不前卫或狭窄。这是“如何基于 Indy10+OpenSSL 制作真正现代、可靠的 SSL 客户端”主题的中间路线。简而言之,这些漏洞表明要避免使用 SSL 2/3,并且在许多情况下 TLS 1.0 也被认为是易受攻击的。许多基于 CBC 的密码被认为是不安全的。

我应该补充:这不是假设。我们在 2014 年初(pre-poodle)有一位渗透测试顾问在他的报告中指出,我们的应用程序服务器(用于我们的网络应用程序)仅设置为 TLS 1.2,并禁用所有其他 SSL 协议(protocol)。这位顾问是一家大型网络安全公司的一部分,他们在每次审查时都会建议这一点。我相信他们所做的是行业标准。

Indy 10 构建: gsIdVersion = '10.6.0.5213';

在代码中,indy 设置为:SSLOptions.SSLVersions := [ sslvSSLv23 ]

和 openssl 库: 1.0.1.10/1.0.1J

使用 Win2012-R2 服务器和 ssl 证书进行测试。我们正在逐步关闭 Web 服务器上的 SSL 以符合最新的 SSL 最佳实践。

我们发现了一个问题:当我们仅执行最佳实践和 TLS 1.2 时,Indy 10 无法连接。

浏览器连接正常。

我们如何测试:

  • Win2012-R2,商业 SSL 证书。
  • 使用 Nartac 软件“iis crypto”UI 修改 Win2012 服务器上的 SSL 配置(schannel.dll 配置)(以下屏幕截图)

结果:

  • 当我们只实现“最佳实践”时,Indy10 可以正常连接。 OpenSSL 日志信息:

    SSL 状态:“SSL 协商成功完成”

    密码:名称= AES256-SHA; 描述 = AES256-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA1 ;位 = 256;版本 = TLSv1/SSLv3;

  • 但是当我们采用上述方法并禁用 TLS 1.0 和 TLS 1.1 时,indy 应用程序无法再连接。打开 SSL 日志:

    SSL 状态:“SSLv2/v3 写入客户端 hello A”

    SSL 状态:“SSLv2/v3 读取服务器 hello A” 套接字错误#10054 连接由对等方重置。

这是 IIS 加密配置: (下面的最佳实践按钮一键实现了 Microsoft 在此处推荐的内容:https://technet.microsoft.com/library/security/ms12-006)

enter image description here enter image description here enter image description here

最佳答案

正如 Remy 在对 OP 的评论中指出的那样,解决方案是使用 Indy 10 SSLIOHandler 的 CipherList 属性来设置密码列表。

可用密码:

https://www.openssl.org/docs/apps/ciphers.html

一些注意事项:

1) 我们无法使上面 openssl 文档页面上的通配符示例正常工作。 例如:ALL:!ADH:@STRENGTH 之类的,我们无法工作。

2) 正确的格式是密码列表,带有冒号分隔符。例如。 AES128-SHA256:AES128-GCM-SHA256:ECDH-RSA-NULL-SHA

3) 我们发现提供一长串密码(40 或更多)实际上会减少我们与各种 SSL 服务器的连接。 (看起来有些可能在同一个列表中不兼容,或者 openssl 在与远程服务器协商方面做得不完美。)列表的子集给出了更好的结果。

4) 到目前为止,我们还没有找到可靠的推荐列表。

5) 我们被告知,由于其中一些密码的昂贵(CPU 密集型)性质,我们可能应该避免使用某些密码。目前我们还没有进一步调查这个领域。

6) 为了让您的应用面向 future ,允许配置或注册表条目修改字段中的密码列表。 (谁知道接下来会利用和禁用什么...今天是 SSL v3,明天是 TLS 1.1...)

关于Delphi w Indy 10 : Unable to connect via TLS 1. 2 w SSL "Best Practices"在网络服务器上就位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27302773/

相关文章:

android - 在 Android 2.3.3 上实现 TLS 1.2

Python Acme V2 - 重用订单/挑战

delphi - 我如何测试函数和过程,因为它们不属于 Delphi 中的类?

delphi - 是否可以在 Delphi LiveBindings 中使用堆叠表达式/为 `CustomFormat` 指定多个参数?

delphi - 在 Delphi 中迭代枚举中的项目

java - 如何列出http服务器目录中的所有文件?

Apache 不提供 H2

android - 仅针对 Android 7.0 向 HTTPS 服务器发出请求时,React native fetch() 失败

delphi - Delphi Berlin试用版是MacOSX和iOS版还是入门版?

asp.net-mvc - QueryString 中的 SessionID 还是 GET 请求中的 Cookie 优先?