delphi - TIdServerIOHandlerSSLOpenSSL.SSLOptions.CipherList 中密码名称的顺序重要吗?

标签 delphi ssl openssl indy

我将我的网络服务允许的密码限制为仅这些 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 跟踪:

enter image description here

您还可以使用 -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/

相关文章:

linux - curl - 禁止证书验证错误文本,而不是错误本身

python - 模块未找到错误: No module named 'OpenSSL'

Android ssl : javax.net.ssl.SSLPeerUnverifiedException:没有对等证书(再次)

apache - 我在哪里可以找到 CentOS 服务器中的 ssl.conf 文件?

string - 如何检测字符串中的字符是大写还是小写?

sql - Delphi 更新连接查询

delphi - 如何用回车键按下按钮

python - 证书未到期更新,但模拟更新以进行试运行

ssl - Heroku SSL - 没有给出的证书是域名证书

delphi - 如何从 JvtThumbview 拖动缩略图?