我根据 Ubuntu 20.04 安装了 OpenSSL 1.1.1f,我特别希望启用TLS v1.2 套件TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
( )。ECDHE-ECDSA-AES128-CCM8
如何配置 OpenSSL 以允许将该密码套件用于其他使用 OpenSSL 安装的 TLS 应用程序?
关于我的用例的详细信息:我有一个 .NET(6) 应用程序,并且.NET 使用当前的 OpenSSL 1.1.1 或更高版本安装作为Linux 上的底层 TLS 提供程序。因此,当该应用程序使用 OpenSSL 时,需要将 OpenSSL 配置为允许 CCM 密码套件。(它将使用openssl.cnf
as per openssl version -d
)
我在 OpenSSL 手册的配置部分看到我有兴趣配置的模块是ssl_conf
,因此我创建了以下 cnf:
openssl_conf = default_conf
[default_conf]
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
CipherString = ECDHE-ECDSA-AES128-CCM8
但这不允许应用使用 TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8。当我的 TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 独占客户端尝试连接时,它会出现握手 40 失败,因为应用程序内部会抛出一个'Interop.OpenSsl.SslException' in System.Net.Security.dll
但是,我确认此配置文件有效,因为如果我使用以下 cnf 而不是 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 作为密码字符串中的唯一过滤器,那么应用程序可以专门使用 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 并且它可以按预期工作(...GCM_SHA256 专用客户端可以连接) :
...
[system_default_sect]
CipherString = ECDHE-RSA-AES128-GCM-SHA256
如何启用 TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8?
而且我不确定如何确认 CCM 的启用...我希望当我运行openssl ciphers -v
(没有密码字符串过滤器)时,我会看到 CCM8 被列出,就像 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 被列出一样。
我阅读了这本烹饪书的配置部分:https ://www.feistyduck.com/library/openssl-cookbook/online/openssl-command-line/configuration.html ,但我认为我需要一些有经验的建议来解释为什么我不能只使用 CCM8。
要“启用”与 .NET 应用程序一起使用的非默认密码套件,必须配置 OpenSSL。许多框架应用程序(例如 .NET 应用程序)在后台使用 OpenSSL,可以创建 OpenSSL 配置,然后将环境变量设置
OPENSSL_CONF
为配置文件的完整路径。大多数使用 OpenSSL 的应用程序将使用OPENSSL_CONF
环境变量来获取使用 OpenSSL 时应使用的配置文件。OpenSSL 将使用openssl.cnf
不启用所有密码套件的默认设置,以确保应用程序不会使用安全性较低的密码套件。在启用应用程序使用的情况下,
TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
可以创建以下配置文件:然后在从同一个 shell 实例启动应用程序之前设置
OPENSSL_CONF
为/example/path/myCustomOpenSSL.cnf
(所以OPENSSL_CONF
是正确的),或者如果您正在开发应用程序,您可以OPENSSL_CONF
在应用程序代码中设置。...
我的问题是我未能为该应用程序提供 ECDSA 证书。为了使用
TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
该应用程序,必须具有 ECDSA 证书 - 即使用 ECDSA 密钥签名。我在 Visual Studio 中工作并通过 WSL 运行我的应用程序。Visual Studio 在/etc/ssl/certs
. 这些默认的开发证书是基于 RSA 的,所以虽然应用程序没有抱怨没有证书,但它有一个不兼容的证书,因此是'Interop.OpenSsl.SslException' in System.Net.Security.dll
例外。因此,我将应用程序配置为使用基于 ECDSA 的证书,而不是默认的基于 RSA 的开发证书,瞧!
所以我创建的 cnf 文件正在“启用”
TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
。注意:.NET 不需要使用 OpenSSL cnf 进行密码套件选择,因为您可以创建 CipherSuitePolicy以在代码中定义您的应用程序密码套件。