TIdServerIOHandlerSSLOpenSSL.SSLOptions.CipherList中的密码名称顺序是否重要?

Jan*_*gen 4 delphi ssl openssl indy

我限制了我的web服务只允许这些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的评论:

我现在按顺序获取这个SO答案生成的密码.
因为我们目前使用的是Delphi XE2/Indy 10.5.8.0/OpenSSL 1.0.2f,所以我忽略了ECDHE密码,这些软件版本实现起来太麻烦了.
此外,我们仍然允许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)
Run Code Online (Sandbox Code Playgroud)

转换为OpenSSL名称(根据映射OpenSSL密码套件名称到RFC名称),这些是:

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
Run Code Online (Sandbox Code Playgroud)

服务器提供密码的顺序很重要,但我是否可以控制此顺序?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';
Run Code Online (Sandbox Code Playgroud)

如果是这样,建议的订单是什么?

请注意,由于我的webservice是服务器,我已设置SSLOptions.Mode := sslmServer.

*这些是nmap脚本ssl-enum-ciphers与'A'成绩的那些

jww*_*jww 5

密码的顺序是否TIdServerIOHandlerSSLOpenSSL.SSLOptions.CipherList重要?

大多数是的.

TLS 没有指定谁决定密码.通常,服务器尊重客户的偏好.也就是说,服务器将使用客户端的第一个首选项(如果可用并启用),或客户端的第二个首选项(如果可用并启用),依此类推.

大多数库允许服务器覆盖行为.例如,使用OpenSSL,SSL_OP_CIPHER_SERVER_PREFERENCE选项.在这种情况下,服务器将匹配服务器的第一个首选项(如果客户端通告它),服务器的第二个首选项(如果客户端通告它,等等).

对于我控制的服务器,我调整密码套件列表并通常设置,SSL_OP_CIPHER_SERVER_PREFERENCE因为许多客户端不关注细节.他们只是在ClientHello中抛出密码套餐,希望有些东西可以粘贴.


服务器提供密码的顺序很重要,但我是否可以控制此顺序?

是.

在服务器上,确定密码套件的顺序,然后使用SSL_CTX_set_cipher_list或设置它们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检查ClientHello.它很容易生成一个s_client,它显示了OpenSSL的默认密码套件列表:

$ openssl s_client -connect www.ietf.org:443 -tls1 -servername www.ietf.org
Run Code Online (Sandbox Code Playgroud)

相应的Wireshark跟踪包含55个默认密码套件:

在此输入图像描述

您还可以通过-cipher选项和方式改善安全状况并减少密码套件的数量"HIGH:!aNULL:!MD5:!RC4".密码套数将减少到约35.

 $ openssl s_client -connect www.ietf.org:443 -tls1 -servername www.ietf.org \
     -cipher 'HIGH:!aNULL:!MD5:!RC4'
Run Code Online (Sandbox Code Playgroud)

如果您不喜欢TripleDES和Cameilla,那么您可以将其减少到大约20个密码套件:

$ openssl s_client -connect www.ietf.org:443 -tls1 -servername www.ietf.org \
    -cipher 'HIGH:!aNULL:!MD5:!RC4:!3DES:!CAMELLIA'
Run Code Online (Sandbox Code Playgroud)

现在,假设客户端仅配置了,并且仅配置RC4-MD5了服务器AES-GCM.即,客户端和服务器之间没有密码套件的交集.在这种情况下,您将在OpenSSL中收到错误.错误将是0x1408A0C1,"没有共享密码套件".它在服务器上看起来像这样:

140339533272744:error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher:s3_srvr.c:1353
Run Code Online (Sandbox Code Playgroud)

对于基于OpenSSL的客户端和服务器,您可以使用"DEFAULT"字符串确定默认密码套件列表.这就是它的名字(查看ciphers(1)手册页).

其中有103个,其中包括弱和受伤的算法.在实际操作中,您希望将其配对至16个左右的密码套件(即您的安全状态):

$ openssl ciphers -v 'DEFAULT' | cut -f 1 -d " " | wc -l
     103
Run Code Online (Sandbox Code Playgroud)

和:

$ 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
Run Code Online (Sandbox Code Playgroud)