我将我的网络服务允许的密码限制为仅这些 TLS 1.x 密码:
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
TLS_RSA_WITH_IDEA_CBC_SHA
TLS_RSA_WITH_RC4_128_MD5
TLS_RSA_WITH_RC4_128_SHA
更新以响应Dave Thompson的评论:
我现在使用从 this SO answer 生成的密码, 按此顺序。
因为我们目前使用的是 Delphi XE2/Indy 10.5.8.0/OpenSSL 1.0.2f,所以我省略了 ECDHE 密码,这些是 too cumbersome to implement with these software versions .
此外,我们仍然允许 TLS 1.0。
在更新到 Delphi Seattle 10 之后,我们将禁止 TLS 1.0 并将 ECDHE 密码放回原处。
这留下了:
TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (0xcc15)
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (0x9f)
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 (0x9e)
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 (0x6b)
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 (0x67)
TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 (0xc4)
TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x39)
TLS_DHE_RSA_WITH_AES_128_CBC_SHA (0x33)
TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA (0x88)
TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA (0x45)
转换为 OpenSSL 名称(根据 Mapping OpenSSL cipher suite names to RFC names )这些是:
DHE-RSA-CHACHA20-POLY1305
DHE-RSA-AES256-GCM-SHA384
DHE-RSA-AES128-GCM-SHA256
DHE-RSA-AES256-SHA256
DHE-RSA-AES128-SHA256
- cannot find the equivalent for 0xc4 - anyone? -
DHE-RSA-AES256-SHA
DHE-RSA-AES128-SHA
DHE-RSA-CAMELLIA256-SHA
DHE-RSA-CAMELLIA128-SHA256
服务器提供密码的顺序很重要,但我可以控制这个顺序吗? CipherList 是一个字符串属性,包含这些用“+”连接的名称:
TIdServerIOHandlerSSLOpenSSL.SSLOptions.CipherList := 'DHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SH:DHE-RSA-AES128-SHA:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-CAMELLIA128-SHA256';
如果是这样,推荐的顺序是什么?
请注意,因为我的网络服务是服务器,所以我设置了 SSLOptions.Mode := sslmServer
。
* 这些是 nmap脚本 ssl-enum-ciphers成绩为“A”
最佳答案
Is the order of cipher names in
TIdServerIOHandlerSSLOpenSSL.SSLOptions.CipherList
important?
大部分是。
TLS 不指定谁决定密码。按照惯例,服务器尊重客户端的偏好。也就是说,服务器将使用客户端的第一首选项(如果可用且已启用),或者客户端的第二首选项(如果可用且已启用),依此类推。
大多数库允许服务器覆盖行为。例如,对于 OpenSSL,SSL_OP_CIPHER_SERVER_PREFERENCE
选项。在这种情况下,如果客户端通告,服务器将匹配服务器的第一偏好,如果客户端通告,服务器将匹配服务器的第二偏好,依此类推。
对于我控制的服务器,我调整密码套件列表,通常设置 SSL_OP_CIPHER_SERVER_PREFERENCE
因为很多客户不注意细节。他们只是在 ClientHello 中扔了一堆密码套件,希望能坚持下去。
The order in which a server offers ciphers is important, but do I have control over this order?
是的。
在服务器上,确定您的密码套件顺序,然后用 SSL_CTX_set_cipher_list
设置它们或 SSL_set_cipher_list
.通过设置列表,您可以确保 RC4-MD5
即使是客户的第一选择也没有使用(假设您省略了它)。为了获得最大影响,还设置 SSL_OP_CIPHER_SERVER_PREFERENCE
上下文选项。
另见 How do I disable a particular cipher suite in openssl?上下文是 OpenSSL,但它应该让您了解在 Delphi 中去哪里。
(Comments): What's not clear to me from your answer: Does the CipherList property already signify an order? If I look at the underlying Delphi/Indy code I see that it is just a wrapper for external function
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 检查 ClientHello。用 s_client
很容易生成一个,它向您展示了 OpenSSL 的默认密码套件列表:
$ openssl s_client -connect www.ietf.org:443 -tls1 -servername www.ietf.org
以及填充了 55 个默认密码套件的相应 Wireshark 跟踪:
您还可以使用 -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 的客户端和服务器,您可以使用 "DEFAULT" 字符串确定默认密码套件列表。这就是它的名字(检查 ciphers(1)
man page )。
其中有 103 个,其中包括弱算法和受伤算法。在实践中,您希望将它配对到 16 个左右您觉得使用起来很舒服的密码套件(即您的安全状况):
$ openssl ciphers -v 'DEFAULT' | cut -f 1 -d " " | wc -l
103
和:
$ 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
关于delphi - TIdServerIOHandlerSSLOpenSSL.SSLOptions.CipherList 中密码名称的顺序重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36353831/