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

2023-12-02

我将 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

Update回应戴夫·汤普森的评论:

我现在采用生成的密码这个答案, 以该顺序。
因为我们当前使用 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)

转换为 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

服务器提供密码的顺序很重要,但我可以控制这个顺序吗? 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.

* These are the ones that the nmap script ssl-enum-ciphers grades with an 'A'


密码名称的顺序是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

您还可以使用以下方法改善安全状况并减少密码套件的数量-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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TIdServerIOHandlerSSLOpenSSL.SSLOptions.CipherList 中密码名称的顺序重要吗? 的相关文章

  • SSL 与 WinHTTP

    我用 winhttp 创建了一个简单的 Web 服务器 它只有一个客户端 一个网站 在我启用 SSL 之前它工作得很好 我没有收到任何错误 并且一切似乎都正常 但网站在尝试连接时收到错误代码 104 并且我在服务器中没有看到任何活动 该网站
  • 过去使用 OpenSSL 和 PHP 设置 notBefore 的 x509 证书

    签署证书请求的服务器的内部时钟显然比客户端时钟快几秒钟 因此 当我签署 CSR 时 我需要在证书中设置 不早于 几秒钟 我不想调回服务器的内部时钟 因为这看起来像是一个黑客解决方案 目前我使用以下命令签署 csr 并生成证书 usercer
  • 了解非 SSL 登录表单的风险

    作为 Web 应用程序的用户 我倾向于只注册使用 SSL 安全登录表单的服务 作为一名开发人员 我知道风险在于非 SSL 表单以纯文本形式传输 不道德的个人可能会 嗅探 HTTP 流量并确定我的登录名和密码 但是 如果我在家中使用 DSL
  • Delphi - 引用在运行时创建的组件

    我正在使用 Delphi 5 并且在运行时创建许多面板 然后在面板上创建按钮 显然也是在运行时创建 我需要这样做 因为将来我可能需要动态创建更多面板 按钮组合 我可以完成所有这些 但我不知道如何引用我创建的面板 因为我找不到访问面板组件名称
  • Telegram 向 webhook 发送重复的 POST JSON 请求

    我正在尝试开发用于电报的城市机器人 但遇到了问题 向机器人发送消息后 Telegram 向 webhook url 发送 2 个重复请求 Webhook 脚本运行两次并向用户发送两次响应 脚本 来自官方电报文档的 hellobot php
  • 使用 OpenSSL 从证书签名请求中提取请求的有效期

    我们使用由 OpenSSL 提供支持的私有证书颁发机构来对我们的客户进行身份验证 我们提供了一个简单的基于 Web 的实用程序 允许他们上传 CSR 文件以供证书颁发机构签名 目前 我们只能颁发固定期限的证书 目前为 365 天 然而 我们
  • 为什么我的 Delphi FindDialog 中的光标没有变成沙漏形?

    我只是用以下命令打开 FindDialog FindDialog Execute 在我的 FindDialog OnFind 事件中 我想将光标更改为沙漏以搜索大文件 这可能需要几秒钟 所以在 OnFind 事件中我这样做 Screen C
  • Delphi XE3,丑陋的 StringGrid 边框

    与 Delphi 7 相比 为什么 XE3 中的 String Grid 边框如此不清晰 如何解决这个问题 Delphi 2010 之后所有的网格都是主题化的 要在网格上禁用新主题 您必须设置属性 在对象检查器中将 DrawingStyle
  • Delphi 生成的 Dylib 在 OSX 上的可靠部署

    我想在 OSX 上部署一个 dylib 它是用 Delphi 创建的 这个 dylib 应该是可由第三方应用程序加载 这看起来像是一个重复的问题 但经过大量搜索后 我找不到答案 这和这个是同一个问题 https forums embarca
  • 在本地主机上设置 (https) SSL 以进行流星开发

    如何创建自签名 SSL 证书以在 mac 10 9 上的本地服务器上使用 我需要我的本地主机作为https localhost 我正在使用 linkedin API 这里解释了需要本地主机上的 ssl 的功能 https developer
  • 如何导入 Java 密钥库中现有的 X.509 证书和私钥以在 SSL 中使用?

    我在 ActiveMQ 配置中有这个
  • 推荐用于 Delphi 棋盘游戏的 2D Sprite 引擎? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 对于 Delphi 精灵引擎 我应该考虑哪些选择 我知道 GLScene 安道尔 2D 我还缺少什么吗 最好是依赖 OpenGL 仅 Di
  • 如何使用 Delphi XE 发送 WCF 的 ClientCredentials

    我开发了一个带有自定义的 WCF 服务UserNamePasswordValidator with a basicHttpBinding使用 HTTPS 它与 Net 客户端配合得很好 使用 ClientCredentials 发送用户名和
  • 在代理后面使用 Maven 和 SSL 时出现问题

    我刚刚下载了 Maven 并尝试运行 五分钟内的 Maven 页面上找到的简单命令 http maven apache org guides getting started maven in Five millions html http
  • 设置第二个 TFDPhysFBDriverLink - 可能且必要吗?

    我的应用程序有设计时间TFDConnection and TFDPhysFBDriverLink作为源连接 这可能会也可能不会在 Firebird 嵌入模式下打开 如果是这样 FDPhysFBDriverLink VendorLib fbe
  • SSL_connect:SSL_ERROR_SYSCALL 连接到 github.com:443

    几天后 我遇到了 Mac OS High Sierra 10 13 3 的问题 当我运行git clone like git clone github com xxx git failed它打印 LibreSSL SSL connect S
  • 使用 Indy 组件下载、暂停和恢复下载

    实际上我正在使用 TIdHTTP 组件从互联网下载文件 我想知道是否可以使用此组件或另一个 indy 组件暂停和恢复下载 这是我当前的代码 这可以正常下载文件 没有简历 但是 现在我想暂停下载关闭我的应用程序 当我的应用程序重新启动时 然后
  • 如何清除客户端.Net SSL会话缓存

    我正在编写一个小测试工具 它使用 HttpWebRequest 来负载测试服务器 我想要 每次我尝试调用 HttpWebRequest GetResponse 时 它都会建立一个新的 SSL 会话 而不是使用缓存中的会话 注意 我提供客户端
  • 保留部分桌面

    如何使用 Delphi 保留桌面的一侧 像 Vista 侧边栏那样的东西 你想要的叫做应用程序桌面工具栏 http msdn microsoft com en us library bb776821 28VS 85 29 aspx 您必须使
  • NodeJS 生成用于签名和验证消息的有效 PEM 密钥

    Context 来自关于 Node v10 9 0 的 TLS SSL 的 NodeJS 文档 2018 年 8 月 https nodejs org api tls html tls tls ssl concepts https node

随机推荐