我如何强制 ansible(或者 python)在 Ubuntu 22.04 中以 seclevel 0 使用 openssl?

我如何强制 ansible(或者 python)在 Ubuntu 22.04 中以 seclevel 0 使用 openssl?

我在一台装有 Ubuntu 22.04 的主机上安装了 ansible,然后尝试使用 winrm 连接到装有 Windows Server 2012 R2 的主机。问题是我收到连接错误。

经过几个小时追踪错误后,我找到了原因:

  • 使用sslscan(使用该--show-sigs选项)我发现 Windows 主机仅接受rsa_pkcs1-sha1服务器签名算法(据我调查,我了解该算法在密钥交换期间使用,与证书相关的签名算法无关)。我很想说这是 Windows Server 2012 R2 的正常行为,但我不是 Windows 专家,无法确定这一点。
  • Ubuntu 22.04 默认配置了 openssl 3.0.2,安全级别为 2。据我所知,该版本和该安全级别的 openssl 不使用任何使用 SHA1 的算法。这意味着,在与 Windows 主机进行 TLS 握手期间,openssl 永远不会rsa_pkcs1-sha1在客户端 Hello 的 signature_algorithms 列表中将该算法显示为受支持的算法(我使用 Wireshark 确认了这一点)。
  • 由于 Windows Server 2012 R2 主机只理解rsa_pkcs1-sha1,但它没有出现在客户端问候语中,所以主机唯一能做的就是终止连接,并在事件查看器中留下以下消息:从远程客户端应用程序收到了 TLS 1.2 连接请求,但服务器不支持客户端应用程序支持的任何密码套件。请注意,该消息有点误导,因为密码套件根本没有问题。问题在于密钥交换的签名算法。

掌握这些信息后,我决定将 openssl 的 seclevel 从 2 降级为 0。seclevel 0 意味着 openssl 的行为将与以前版本的 openssl 类似(特别是允许 SHA1)。我能够使用命令openssl s_client和 Wireshark 确认,此更改允许 openssl 连接到 Windows 主机,因为在 seclevel 0 时,openssl 确实将rsa_pkcs1-sha1算法包含在客户端 Hello 的 signature_algorithms 列表中。

现在的问题是,即使/etc/ssl/openssl.cnf配置为 seclevel 0,ansible 仍然无法连接到 Windows 主机。我猜 ansible 使用了 openssl 的一些 python 包装器,完全绕过了/etc/ssl/openssl.cnf配置文件。所以问题是:我如何强制 ansible(或 python)在 seclevel 0 使用 openssl?

相关内容