使用 Openssl s_server 限制密码套件选择

Posted

技术标签:

【中文标题】使用 Openssl s_server 限制密码套件选择【英文标题】:Restrict cipher suite selection using Openssl s_server 【发布时间】:2020-09-17 11:29:05 【问题描述】:

我想针对测试服务器测试我的客户端,所以我使用 OpenSSL s_server 命令。目标是将服务器配置为仅选择我配置的 1 个密码套件。这样我可以测试客户端发送的不同密码套件。我无法在客户端更改密码套装列表。

启动我使用的服务器:

`` openssl s_server -accept 50000 -cert ../server/server_certificate.pem -key ../server/private_key.pem -CAfile ca_certificate.pem  -cipher ECDHE-RSA-AES256-GCM-SHA384 -serverpref -state -debug -status_verbose 

为了测试服务器是否选择了配置的密码套件,我启动客户端为

openssl s_client -connect 3.135.190.131:50000 -cert ../client/client_certificate1.pem -key ../client/private_key.pem -CAfile ca_certificate.pem

但是当我开始将客户端连接到服务器时,服务器选择:TLS_AES_256_GCM_SHA384 而不是配置的:ECDHE-RSA-AES256-GCM-SHA384 另外,我检查了跟踪,客户端确实在密码套件列表中发送了 ECDHE-RSA-AES256-GCM-SHA384。

您能否建议服务器端命令可能有什么问题?

【问题讨论】:

【参考方案1】:

您的服务器和客户端想要使用 TLS 1.3,它有自己的一组严格的密码套件,包括ECDHE-RSA-AES256-GCM-SHA384

这些可以通过-ciphersuites 参数更改为s_server。这套密码套件是对-ciphers 设置的 TLS 1.2 密码的补充。根据 [手册页](https://www.openssl.org/docs/man1.1.1/man1/openssl-s_server.html:

-密码验证

这允许修改服务器使用的 TLSv1.2 及以下密码套件列表。此列表与任何 已配置的 TLSv1.3 密码套件。当客户端发送 支持的密码列表第一个客户端密码也包含在 使用服务器列表。因为客户指定了偏好 顺序,服务器密码列表的顺序无关紧要。见 ciphers 命令了解更多信息。

-密码套件验证

这允许修改服务器使用的 TLSv1.3 密码套件列表。此列表与任何 TLSv1.2 和 在已配置的密码套件下方。当客户端发送一个 支持的密码列表第一个客户端密码也包含在 使用服务器列表。因为客户指定了偏好 顺序,服务器密码列表的顺序无关紧要。见 ciphers 命令以获取更多信息。此列表的格式是 简单冒号 (":") 分隔的 TLSv1.3 密码套件名称列表。

如果我们尝试完全删除 TLS 1.3 密码套件,只留下 TLS 1.2 密码,服务器端会发生以下情况:

$ openssl s_server -accept 50000 -cert node.crt -key node.key -CAfile ca.crt  -cipher ECDHE-RSA-AES256-GCM-SHA384 -serverpref -state -debug -status_verbose -ciphersuites ""
Using default temp DH parameters
ACCEPT
write to 0x55c8894b0bd0 [0x55c8894c83f0] (7 bytes => 7 (0x7))
0000 - 15 03 03 00 02 02 28                              ......(
SSL3 alert write:fatal:handshake failure
SSL_accept:error in error
ERROR
139842681824576:error:141FC0B5:SSL routines:tls_setup_handshake:no ciphers available:../ssl/statem/statem_lib.c:127:No ciphers enabled for max supported SSL/TLS version
shutting down SSL
CONNECTION CLOSED

服务器上没有启用有效的 TLS 1.3 密码套件,但客户端和服务器都支持 TLS 1.3。这会导致连接失败(没有 TLS 降级)。

相反,您需要在两方之一上将最高版本强制为 TLS 1.2。我们可以在服务器上执行此操作(留下-ciphersuites,因为它不再被使用):

$ openssl s_server -accept 50000 -cert node.crt -key node.key -CAfile ca.crt  -cipher ECDHE-RSA-AES256-GCM-SHA384 -serverpref -state -debug -status_verbose -no_tls1_3
...
CIPHER is ECDHE-RSA-AES256-GCM-SHA384
Secure Renegotiation IS supported

wiki.openssl.org/TLS1.3 的 Ciphersuites 部分详细介绍了这一切

【讨论】:

以上是关于使用 Openssl s_server 限制密码套件选择的主要内容,如果未能解决你的问题,请参考以下文章

02Linux下sshd以及openssl的知识点

OpenSSL之摘要MD5用法

OpenSSL - 密码与盐目的

如何使用busybox 和openssl 在脚本中更改用户密码?

OpenSSL 入门:密码学基础知识

如何使用命令行中的密码生成 openSSL 密钥?