我按照 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 使用当前的 OpenSSL1.1.1 或更高版本安装为Linux 上的底层 TLS 提供程序。因此,据我所知,当该应用程序使用 OpenSSL 时,需要配置 OpenSSL 以允许 CCM 密码套件。(它将使用openssl.cnf
按照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。
答案1
要“启用”非默认密码套件以与 .NET 应用程序一起使用,必须配置 OpenSSL。许多框架应用程序(例如 .NET 应用程序)在底层使用 OpenSSL,可以创建 OpenSSL 配置,然后将环境变量设置OPENSSL_CONF
为配置文件的完整路径。大多数使用 OpenSSL 的应用程序将使用OPENSSL_CONF
环境变量来获取使用 OpenSSL 时应使用的配置文件。 OpenSSL 将使用openssl.cnf
不启用所有密码套件的默认设置,以确保应用程序不会使用安全性较低的密码套件。
如果允许应用程序使用,TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
可以创建以下配置文件:
# myCustomOpenSSL.cnf
openssl_conf = default_conf
[default_conf]
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
#CipherString is a colon separated list of terms that filter what TLS v1.2 suites OpenSSL will allow use of.
[system_default_sect]
CipherString = ECDHE-ECDSA-AES128-CCM8
然后在从同一个 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在代码中定义您的应用程序密码套件。