在this question中,我询问了有关在Delphi XE2下限制Web服务的可用SSL / TLS协议的问题。
通过使用TIdServerIOHandlerSSLOpenSSL
组件并将其SSLOptions.SSLVersions
属性设置为[sslvSSLv23,sslvTLSv1]
,我可以将其可用协议限制为TLS1.x。
现在,在升级到Delphi Seattle Upgrade 1之后,我想进一步将其限制为仅TLS 1.1和1.2:
LIOHandleSSL.SSLOptions.SSLVersions := [sslvTLSv1_1,sslvTLSv1_2];
但这根本不起作用。当尝试连接时,我得到一个
exception class EidOSSLUnderlying CryptoError with message
'Error accepting connection with SSL. error: 140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol'
和
Error connecting with SSL
EOF was observed that violates the protocol
这里发生了什么?如何解决?
笔记:
经过OpenSSL 1.02f和1.02h测试
设置“旧”组合
[sslvSSLv23,sslvTLSv1]
有效包括TLS 1.0也可以:
[sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2]
最佳答案
我个人只是将SSLVersion保留为其默认值,而是使用SSLOptions.CipherList
来仅使用已知的secure ciphers来限制SSL:
LIOHandleSSL.SSLOptions.CipherList := 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
这应该隐式禁用较旧的SSL版本,因为这些版本不支持指定的密码AFAIK。
请注意,默认情况下,OpenSSL 1.0.2g +禁用SSLv3,除非在编译过程中明确将其激活。