问题:我们如何让Indy 10与强制执行最新TLS 1.2 SSL最佳实践的网络服务器配合使用?
最佳实践由Microsoft记录: https://technet.microsoft.com/library/security/ms12-006从本质上讲,在多个TLS版本中使用的一大块密码被认为是不安全的。请注意,这个kb是从2013年中期开始,远远超过贵宾犬。
作为一种最佳实践,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),他的报告显示我们的应用程序服务器(对于我们的Web应用程序)仅设置为TLS 1.2,并禁用所有其他SSL协议。这位顾问是一家大型网络安全公司的一部分,他们在每次审核时都会提供建议。我相信他们所做的是行业标准。
Indy 10 build: gsIdVersion = '10 .6.0.5213';
在代码中, indy设置为:SSLOptions.SSLVersions:= [sslvSSLv23]
和openssl libs: 1.0.1.10 / 1.0.1J
使用带有ssl证书的Win2012-R2服务器进行测试。我们正逐步调低Web服务器上的SSL,以符合最新的SSL最佳实践。
我们发现了一个问题:当我们执行最佳做法和仅限TLS 1.2时,Indy 10无法连接。
浏览器连接正常。
我们如何测试:
结果:
当我们实施“最佳实践”时,Indy10可以很好地连接。 OpenSSL日志信息:
SSL状态:“SSL协商成功完成”
密码:name = AES256-SHA; description = AES256-SHA SSLv3 Kx = RSA Au = RSA Enc = AES(256)Mac = SHA1 ; bits = 256; version = TLSv1 / SSLv3;
但是当我们采用上述内容时,我们禁用TLS 1.0和TLS 1.1,indy应用程序无法再连接。打开SSL日志:
SSL状态:“SSLv2 / v3写客户端问候A”
SSL状态:“SSLv2 / v3读取服务器问候语A” 套接字错误#10054 连接由同行重置。
这是IIS加密配置: (下面的“最佳实践”按钮只需点击一下即可实现Microsoft建议:https://technet.microsoft.com/library/security/ms12-006)
答案 0 :(得分:2)
正如Remy对OP的评论所说,解决方案是使用Indy 10 SSLIOHandler的CipherList属性来设置密码列表。
可用密码:
https://www.openssl.org/docs/apps/ciphers.html
一些注意事项:
1)我们无法在上面的openssl doc页面上获取通配符示例。 例如:ALL:!ADH:@STRENGTH等,我们无法开展工作。
2)正确的格式是密码列表,带有冒号分隔符。例如。 AES128-SHA256:AES128-GCM-SHA256:ECDH-RSA-NULL-SHA
3)我们发现提供一长串密码(40个或更多)实际上使我们与各种服务器的连接更少。 (似乎有些可能在同一个列表中不兼容,或者openssl在与远程服务器协商时做的不完美。)列表的子集给出了更好的结果。
4)到目前为止,我们还没有找到一份坚实的推荐名单。
5)我们被告知,由于某些密码的昂贵(cpu密集)性质,可能应该避免使用某些密码。我们目前尚未对此进一步调查。
6)为了将来证明您的应用,请允许配置或注册表项修改字段中的密码列表。 (谁知道下一步将被利用和禁用...今天SSL v3,明天TLS 1.1 ...)