如何启用非默认 OpenSSL 密码套件

如何启用非默认 OpenSSL 密码套件

我按照 Ubuntu 20.04 安装了 OpenSSL 1.1.1f,并且特别希望启用 TLS v1.2 套件TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8( ECDHE-ECDSA-AES128-CCM8)。

TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 可用

如何配置 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.cnfOPENSSL_CONFOPENSSL_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在代码中定义您的应用程序密码套件。

相关内容