You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不同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

疑问

  1. 导致TLS版本差异的原因是什么?
  2. 如何在RHEL虚拟机上启用TLSv1.3?

原因分析

  1. FIPS模式限制:RHEL 8.4的OpenSSL启用了FIPS模式,而TLSv1.3在早期FIPS 140-2标准中未获得认证,OpenSSL 1.1.1g的FIPS模块默认会禁用TLSv1.3,这是核心差异原因。
  2. SSL上下文默认配置:ssl.create_default_context()会根据系统和OpenSSL的配置自动筛选支持的TLS版本。在FIPS模式下,未通过认证的TLSv1.3会被过滤,而Ubuntu的OpenSSL未启用FIPS,因此能正常使用TLSv1.3。
  3. 版本适配差异:虽然OpenSSL 1.1.1g本身支持TLSv1.3,但FIPS模式的安全限制会覆盖默认支持逻辑,导致RHEL环境无法自动启用该版本。

RHEL 8.4启用TLSv1.3的方法

方法1:修改OpenSSL配置,在FIPS模式下开启TLSv1.3

  1. 编辑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
      
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 00:46:04