密码名称的顺序是TIdServerIOHandlerSSLOpenSSL.SSLOptions.CipherList
重要的?
大部分是的。
TLS 确实not指定由谁决定密码。按照惯例,服务器尊重客户端的偏好。也就是说,服务器将使用客户端的第一首选项(如果可用且已启用),或者客户端的第二首选项(如果可用且已启用),依此类推。
大多数库允许服务器覆盖该行为。例如,使用 OpenSSL,SSL_OP_CIPHER_SERVER_PREFERENCE
选项。在这种情况下,如果客户端通告它,服务器将匹配服务器的第一偏好,如果客户端通告它,服务器将匹配服务器的第二偏好,依此类推。
对于我控制的服务器,我调整密码套件列表并通常设置SSL_OP_CIPHER_SERVER_PREFERENCE
因为很多客户不注重细节。他们只是将密码套件的汤扔到 ClientHello 中,希望能保留一些东西。
服务器提供密码的顺序很重要,但我可以控制这个顺序吗?
Yes.
在服务器上,确定密码套件的顺序,然后使用SSL_CTX_set_cipher_list
or SSL_set_cipher_list
。通过设置列表,您可以确保RC4-MD5
即使是客户的第一选择也不会被使用(假设您忽略它)。为了获得最大的影响,还设置SSL_OP_CIPHER_SERVER_PREFERENCE
上下文选项。
另请参阅如何禁用 openssl 中的特定密码套件?上下文是 OpenSSL,但它应该让您了解在 Delphi 中该去哪里。
(评论):从您的回答中我不清楚什么:CipherList 属性是否已经表示订单?如果我查看底层的 Delphi/Indy 代码,我会发现它只是外部函数的包装器SSL_CTX_set_cipher_list : function(_para1: PSSL_CTX; const str: PAnsiChar): TIdC_INT cdecl = nil; in IdSSLOpenSSLHeaders.pas
如果我正确理解 Delphi,那么我相信答案是肯定的。但它可能使用 (1) OpenSSL 的默认列表,或 (2) Delphi 默认列表。两者可能都是这样的"ALL:!EXP:!LOW"
或类似的。无论哪种情况,您都需要对其进行调整以适合您的口味。
如果您对列表放在网络上时的样子感兴趣,请使用 Wireshark 检查客户您好。很容易生成一个s_client
,它向您展示了 OpenSSL 的默认密码套件列表:
$ openssl s_client -connect www.ietf.org:443 -tls1 -servername www.ietf.org
以及相应的 Wireshark 跟踪,其中填充了 55 个默认密码套件:
![enter image description here](https://i.stack.imgur.com/ikc2R.png)
您还可以使用以下方法改善安全状况并减少密码套件的数量-cipher
选项和"HIGH:!aNULL:!MD5:!RC4"
。密码套件数量将减少至约 35 个。
$ openssl s_client -connect www.ietf.org:443 -tls1 -servername www.ietf.org \
-cipher 'HIGH:!aNULL:!MD5:!RC4'
如果您不喜欢 TripleDES 和 Cameilla,那么您可以使用以下命令将其减少到大约 20 个密码套件:
$ openssl s_client -connect www.ietf.org:443 -tls1 -servername www.ietf.org \
-cipher 'HIGH:!aNULL:!MD5:!RC4:!3DES:!CAMELLIA'
现在,假设客户端仅配置了RC4-MD5
并且服务器仅配置有AES-GCM
。即,客户端和服务器之间没有密码套件的交集。在这种情况下,您将在 OpenSSL 中收到错误。错误将为 0x1408A0C1,“无共享密码套件”。它在服务器上看起来像这样:
140339533272744:error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher:s3_srvr.c:1353
对于基于 OpenSSL 的客户端和服务器,您可以使用以下命令确定默认密码套件列表“默认”细绳。这就是它的字面意思(检查ciphers(1)手册页).
其中有 103 个,其中包括较弱和受伤的算法。在实践中,您希望将其配对到您觉得使用舒适的 16 个左右的密码套件(即您的安全状况):
$ openssl ciphers -v 'DEFAULT' | cut -f 1 -d " " | wc -l
103
And:
$ openssl ciphers -v 'DEFAULT' | cut -f 1 -d " "
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-RSA-AES256-SHA384
ECDHE-ECDSA-AES256-SHA384
ECDHE-RSA-AES256-SHA
ECDHE-ECDSA-AES256-SHA
SRP-DSS-AES-256-CBC-SHA
SRP-RSA-AES-256-CBC-SHA
SRP-AES-256-CBC-SHA
DH-DSS-AES256-GCM-SHA384
DHE-DSS-AES256-GCM-SHA384
DH-RSA-AES256-GCM-SHA384
DHE-RSA-AES256-GCM-SHA384
DHE-RSA-AES256-SHA256
DHE-DSS-AES256-SHA256
DH-RSA-AES256-SHA256
DH-DSS-AES256-SHA256
DHE-RSA-AES256-SHA
DHE-DSS-AES256-SHA
DH-RSA-AES256-SHA
DH-DSS-AES256-SHA
DHE-RSA-CAMELLIA256-SHA
DHE-DSS-CAMELLIA256-SHA
DH-RSA-CAMELLIA256-SHA
DH-DSS-CAMELLIA256-SHA
ECDH-RSA-AES256-GCM-SHA384
ECDH-ECDSA-AES256-GCM-SHA384
ECDH-RSA-AES256-SHA384
ECDH-ECDSA-AES256-SHA384
ECDH-RSA-AES256-SHA
ECDH-ECDSA-AES256-SHA
AES256-GCM-SHA384
AES256-SHA256
AES256-SHA
CAMELLIA256-SHA
PSK-AES256-CBC-SHA
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-ECDSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-SHA256
ECDHE-ECDSA-AES128-SHA256
ECDHE-RSA-AES128-SHA
ECDHE-ECDSA-AES128-SHA
SRP-DSS-AES-128-CBC-SHA
SRP-RSA-AES-128-CBC-SHA
SRP-AES-128-CBC-SHA
DH-DSS-AES128-GCM-SHA256
DHE-DSS-AES128-GCM-SHA256
DH-RSA-AES128-GCM-SHA256
DHE-RSA-AES128-GCM-SHA256
DHE-RSA-AES128-SHA256
DHE-DSS-AES128-SHA256
DH-RSA-AES128-SHA256
DH-DSS-AES128-SHA256
DHE-RSA-AES128-SHA
DHE-DSS-AES128-SHA
DH-RSA-AES128-SHA
DH-DSS-AES128-SHA
DHE-RSA-SEED-SHA
DHE-DSS-SEED-SHA
DH-RSA-SEED-SHA
DH-DSS-SEED-SHA
DHE-RSA-CAMELLIA128-SHA
DHE-DSS-CAMELLIA128-SHA
DH-RSA-CAMELLIA128-SHA
DH-DSS-CAMELLIA128-SHA
ECDH-RSA-AES128-GCM-SHA256
ECDH-ECDSA-AES128-GCM-SHA256
ECDH-RSA-AES128-SHA256
ECDH-ECDSA-AES128-SHA256
ECDH-RSA-AES128-SHA
ECDH-ECDSA-AES128-SHA
AES128-GCM-SHA256
AES128-SHA256
AES128-SHA
SEED-SHA
CAMELLIA128-SHA
IDEA-CBC-SHA
PSK-AES128-CBC-SHA
ECDHE-RSA-RC4-SHA
ECDHE-ECDSA-RC4-SHA
ECDH-RSA-RC4-SHA
ECDH-ECDSA-RC4-SHA
RC4-SHA
RC4-MD5
PSK-RC4-SHA
ECDHE-RSA-DES-CBC3-SHA
ECDHE-ECDSA-DES-CBC3-SHA
SRP-DSS-3DES-EDE-CBC-SHA
SRP-RSA-3DES-EDE-CBC-SHA
SRP-3DES-EDE-CBC-SHA
EDH-RSA-DES-CBC3-SHA
EDH-DSS-DES-CBC3-SHA
DH-RSA-DES-CBC3-SHA
DH-DSS-DES-CBC3-SHA
ECDH-RSA-DES-CBC3-SHA
ECDH-ECDSA-DES-CBC3-SHA
DES-CBC3-SHA
PSK-3DES-EDE-CBC-SHA
EDH-RSA-DES-CBC-SHA
EDH-DSS-DES-CBC-SHA
DH-RSA-DES-CBC-SHA
DH-DSS-DES-CBC-SHA
DES-CBC-SHA