在this question中,我询问是否在Delphi XE2下为我的网络服务限制了可用的SSL / TLS协议。
通过使用TIdServerIOHandlerSSLOpenSSL
组件并将其SSLOptions.SSLVersions
属性设置为[sslvSSLv23,sslvTLSv1]
,我能够将可用协议限制为TLS 1.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
这里发生了什么?如何解决?
注意:
[sslvSSLv23,sslvTLSv1]
有效[sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2]
答案 0 :(得分:4)
我个人只是将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,除非在编译期间明确激活它。