不同Linux机器TLS版本不一致原因排查及RHEL启用TLSv1.3咨询
TLS版本差异原因及RHEL 8.4启用TLSv1.3的方案
问题背景
用户提供的可运行Python TLS代码如下:
import datetime import sys import ssl from aiosmtpd.smtp import SMTP from aiosmtpd.controller import Controller from aiosmtpd.handlers import Debugging class Server: async def handle_DATA(self, server, session, envelope): #some code here return "250 OK" context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) context.load_cert_chain(certfile='cert.pem', keyfile='key.pem') class ControllerStarttls(Controller): def factory(self): return SMTP(self.handler, enable_SMTPUTF8=True,require_starttls=True, tls_context=context) controller = ControllerStarttls(Debugging(), hostname='localhost',port=587) controller.start() controller.stop()
环境对比
- WSL(Ubuntu 20.04.4 LTS):Python 3.8.10、OpenSSL 1.1.1f,测试显示使用TLSv1.3
- RHEL 8.4虚拟机:Python 3.8.6、OpenSSL 1.1.1g FIPS,测试显示使用TLSv1.2
测试命令:
openssl s_client -starttls smtp -crlf -connect localhost:587
疑问
- 导致TLS版本差异的原因是什么?
- 如何在RHEL虚拟机上启用TLSv1.3?
原因分析
- FIPS模式限制:RHEL 8.4的OpenSSL启用了FIPS模式,而TLSv1.3在早期FIPS 140-2标准中未获得认证,OpenSSL 1.1.1g的FIPS模块默认会禁用TLSv1.3,这是核心差异原因。
- SSL上下文默认配置:
ssl.create_default_context()会根据系统和OpenSSL的配置自动筛选支持的TLS版本。在FIPS模式下,未通过认证的TLSv1.3会被过滤,而Ubuntu的OpenSSL未启用FIPS,因此能正常使用TLSv1.3。 - 版本适配差异:虽然OpenSSL 1.1.1g本身支持TLSv1.3,但FIPS模式的安全限制会覆盖默认支持逻辑,导致RHEL环境无法自动启用该版本。
RHEL 8.4启用TLSv1.3的方法
方法1:修改OpenSSL配置,在FIPS模式下开启TLSv1.3
- 编辑OpenSSL配置文件
/etc/pki/tls/openssl.cnf:- 找到
[openssl_init]段,确保包含providers = provider_sect - 添加或修改
[provider_sect]段:[provider_sect] default = default_sect fips = fips_sect - 在
[default_sect]中添加:activate = 1 - 找到
[fips_sect]段,确保activate = 1,并添加TLSv1.3支持配置:[fips_sect] activate = 1 ssl_conf = ssl_sect - 添加
[ssl_sect]和[system_default_sect]段,指定允许的TLS版本范围:[ssl_sect] system_default = system_default_sect [system_default_sect] MinProtocol = TLSv1.2 MaxProtocol = TLSv1.3 CipherString = DEFAULT@SECLEVEL=2
- 找到
- 保存配置后,重启依赖OpenSSL的服务(如需要),重新执行测试命令验证。
方法2:在Python代码中显式指定TLS版本范围
修改代码中的SSL上下文配置,强制包含TLSv1.3:
context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) context.load_cert_chain(certfile='cert.pem', keyfile='key.pem') # 显式设置允许的TLS版本,启用TLSv1.3 context.options |= ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 context.min_version = ssl.TLSVersion.TLSv1_2 context.max_version = ssl.TLSVersion.TLSv1_3
注意:该方法需配合系统层面的FIPS配置修改,若系统完全禁用TLSv1.3,仅代码修改可能无效。
方法3:升级FIPS模块(可选)
RHEL 8后续更新的FIPS模块已支持TLSv1.3,可通过yum升级相关包:
sudo yum update openssl openssl-libs
升级完成后重启系统,再测试TLSv1.3是否可用。
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

