Ubuntu 20.04——OpenSSL 安全级别 1 不起作用

Ubuntu 20.04——OpenSSL 安全级别 1 不起作用

系统信息:

> hostnamectl
  Operating System: Ubuntu 20.04.1 LTS
            Kernel: Linux 5.4.0-42-generic
      Architecture: x86-64

问题:我通过 VPN 访问自托管的 nuget 存储库,以获取 .Net Core 的 nuget 包。当我第一次更新到 Ubuntu 20.04 时,我必须将 SSL 安全级别降低到 1 级,否则dh key too small在调用时会收到错误dotnet restore

我了解到 20.04 将最低安全级别更新为 2,这就是为什么当我从 18.04 更新到 20.04 时它停止工作的原因。我之前已经更新了我的系统/etc/ssl/openssl.cnf以包含此处推荐的更改:Ubuntu 20.04 - 如何设置较低的 SSL 安全级别?

一切似乎都很好,然而最近,我遇到了dh key too small以前遇到的同样的问题,即使我没有改变我的openssl.cnf

> dotnet restore
Determining projects to restore...
  Retrying 'FindPackagesByIdAsyncCore' for source 'https://example.com/repository/nuget-group/FindPackagesById()?id='example_package'&semVerLevel=1.0.0'.
  The SSL connection could not be established, see inner exception.
    Authentication failed, see inner exception.
    SSL Handshake failed with OpenSSL error - SSL_ERROR_SSL.
    error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small

这是我的 openssl 配置的输出:

> cat /etc/ssl/openssl.cnf
openssl_conf = default_conf

#default config....

[ default_conf ]
ssl_conf = ssl_sect

[ ssl_sect ]
system_default = ssl_default_sect

[ ssl_default_sect ]
MinProtocol = TLSv1.2
CipherString = DEFAULT:@SECLEVEL=1

以及当前正在运行的 openssl:

> openssl version -a
OpenSSL 1.1.1f  31 Mar 2020
built on: Mon Apr 20 11:53:50 2020 UTC
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(int) blowfish(ptr) 
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -fdebug-prefix-map=/build/openssl-P_ODHM/openssl-1.1.1f=. -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_TLS_SECURITY_LEVEL=2 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAESNI_ASM -DVPAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPOLY1305_ASM -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1"
Seeding source: os-specific

openssl version -a我所见,-DOPENSSL_TLS_SECURITY_LEVEL=2这表明它在安全级别 2 下运行。

我无法在 Nuget 包存储库端进行任何更改,因此我需要在本地修复此问题。有什么建议吗?

答案1

不,这告诉你默认图书馆的安全级别。

openssl version -f(或-a)告诉你编译标志OpenSSL 的编译环境如下:

   openssl-version - print OpenSSL version information
   -a  All information, this is the same as setting all the other flags.
   -f  Compilation flags.

还有这些的效果是

在编译 OpenSSL 1.1.0 或更高版本时,OPENSSL_TLS_SECURITY_LEVEL 选项配置默认安全级别,为所有库用户建立默认最低安全要求。

似乎没有一个明显的方法可以让 OpenSSL 报告其当前有效使用命令行设置安全级别。但是你可以(相当粗暴地)使用openssl ciphers -v -s命令列出特定级别或当前级别支持的密码,并计算其数量以确定当前级别。例如:

$ openssl ciphers -s -v ALL | wc -l
74

这说明当前默认配置中启用了 74 种密码。然后您可以尝试指定各种安全级别:

$ openssl ciphers -s -v ALL:@SECLEVEL=0 | wc -l
86
$ openssl ciphers -s -v ALL:@SECLEVEL=1 | wc -l
74
$ openssl ciphers -s -v ALL:@SECLEVEL=2 | wc -l
74
$ openssl ciphers -s -v ALL:@SECLEVEL=3 | wc -l
58

这告诉您安全级别 2 和 3 都有 74 种可用密码(即,它们在此系统上是相同的),因此您当前的安全级别是 2 或 3。

你也可以编写一个小程序来调用SSL_CTX_获取安全级别

cat > seclevel.c <<EOF
#include <openssl/ssl.h>

int main()
{
    SSL_CTX* ctx = SSL_CTX_new(TLS_client_method());
    printf("%d\n", SSL_CTX_get_security_level(ctx));
    return 0;
}
EOF
gcc -o seclevel seclevel.c -lssl
./seclevel

这将打印当前有效的安全级别(例如2)。

您可以创建一个openssl.cnf覆盖默认安全级别的文件(例如上面问题中的文件),然后使用该程序OPENSSL_CONF指向该文件来检查它是否有效:

cat > openssl-custom.cnf
[paste example from the question above]
EOF
OPENSSL_CONF=./openssl-custom.cnf ./seclevel 

其中应该输出1,因为上面的示例配置设置了SECLEVEL=1

相关内容