Python SSL 握手过程解析
技术百科
冰川箭仙
发布时间:2026-01-19
浏览: 次 SSL/TLS握手的核心目标是安全协商共享密钥并验证身份,发生在TCP连接后、应用数据传输前;Python ssl模块自动处理,但需理解四步流程及配置影响以排查证书、协议、套件等问题。
SSL/TLS 握手的核心目标
SSL/TLS 握手不是为了“加密数据”,而是为了在通信双方之间安全地协商出一组共享密钥,并确认对方身份。整个过程发生在 TCP 连接建立之后、应用层协议(如 HTTP)传输数据之前。Python 中的 ssl 模块(底层基于 OpenSSL)会自动完成大部分握手逻辑,但理解其步骤有助于排查连接失败、证书错误或兼容性问题。
典型四步握手流程(TLS 1.2 及以上)
以客户端主动发起 HTTPS 请求为例,实际交互包含以下关键环节:
-
ClientHello:客户端发送支持的 TLS 版本、加密套件列表(如
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256)、随机数(client_random),以及可选的 SNI(Server Name Indication)扩展(用于虚拟主机场景) - ServerHello + Certificate + ServerKeyExchange + ServerHelloDone:服务端选择一个加密套件,返回自己的随机数(server_random),发送证书链(含公钥),若使用 ECDHE 等临时密钥交换算法,还会附带签名后的临时公钥参数
-
ClientKeyExchange + ChangeCipherSpec + Finished:客户端验证证书有效性(包括链式信任、域名匹配、有效期等),生成预主密钥(premaster secret),用服务端公钥加密后发送;随后双方基于 client_random、server_random 和 premaster secret 计算出相同的会话密钥(master secret → key block);最后发送加密的 Finishe
d 消息,验证密钥是否一致
- ChangeCipherSpec + Finished:服务端同样切换为加密通信,并发送自己的 Finished 消息。双方确认无误后,握手完成,开始传输加密的应用数据
Python 中影响握手的关键配置
使用 ssl.create_default_context() 或手动构建 SSLContext 时,以下设置会直接改变握手行为:
-
证书验证开关:
context.check_hostname = True启用主机名检查(默认开启);context.verify_mode = ssl.CERT_REQUIRED强制验证服务端证书(生产环境必须);设为CERT_NONE会跳过全部验证(仅测试用,不安全) -
自定义 CA 证书:通过
context.load_verify_locations(cafile="ca-bundle.pem")指定信任的根证书文件,适用于私有 PKI 或内网服务 -
协议版本限制:调用
context.minimum_version = ssl.TLSVersion.TLSv1_2可禁用老旧不安全版本(如 SSLv3、TLS 1.0) -
加密套件筛选:用
context.set_ciphers("ECDHE+AESGCM:!ECDSA")显式指定优先使用的算法组合,避免协商到弱套件
常见握手失败原因与调试方法
当 ssl.SSLError 抛出时,错误信息往往指向具体阶段。例如:
- [SSL: CERTIFICATE_VERIFY_FAILED]:证书不可信 —— 检查系统/Python 是否缺少根证书,或服务端证书链不完整(需补全中间证书)
-
[SSL: UNKNOWN_PROTOCOL]:服务端未启用 TLS,或客户端发了 HTTP 请求却期望 TLS 响应 —— 确认 URL 是
https://,且服务监听在 TLS 端口(如 443) -
[SSL: HANDSHAKE_FAILURE]:加密套件不匹配、协议版本不兼容、SNI 未提供导致虚拟主机路由错误 —— 用
openssl s_client -connect example.com:443 -servername example.com手动测试可辅助定位 - 超时或连接重置:可能因防火墙拦截 TLS 流量、服务端 TLS 配置异常(如只支持 TLS 1.3 但客户端太旧),或网络中间设备(如某些代理)不支持 ALPN 扩展
# ai
# 自己的
# 链式
# python
# 不安全
# 客户端
# https
# 防火墙
# 端口
# http
# 路由
# 并发
# red
# 算法
# ssl
# 套件
# 发生在
# 服务端
# 虚拟主机
# 公钥
# 随机数
# 加密通信
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何理解Go指针和内存分配关系_Go Pointe
- Windows 10怎么把任务栏放在屏幕上方_Wi
- Linux如何安装Tomcat应用服务器_Linu
- 如何使用正则表达式提取以编号开头、后跟多个注解的完
- Win11怎么设置任务栏图标大小_Windows1
- php嵌入式需要什么环境_搭建php+linux嵌
- Win11如何更新显卡驱动 Win11检查和安装设
- 跨文件调用类方法怎么用_php作用域操作符与自动加
- Windows10蓝屏SYSTEM_SERVICE
- Win11怎么设置开机问候语_自定义Win11锁屏
- MAC如何启用访达侧边栏显示_MAC Finder
- 如何优化Golang程序CPU性能_Golang
- Mac的访达(Finder)怎么用_Mac文件管理
- Win11怎么关闭搜索历史_Win11清除任务栏搜
- Win11怎么更改盘符_Win11磁盘管理修改驱动
- MAC如何安装Git版本控制工具_MAC开发环境配
- c++怎么调用nana库开发GUI_c++ 现代风
- 如何使用Golang实现多重错误处理_Golang
- Win11用户账户控制怎么关_Win11关闭UAC
- PHP主流架构怎么集成Redis缓存_配置步骤【方
- Win11如何设置系统声音_Win11系统声音调整
- Windows 11登录时提示“用户配置文件服务登
- php中作用域操作符能访问私有静态属性吗_访问权限
- VSC怎样在Linux运行PHP_Ubuntu系统
- Win10系统字体模糊怎么办_Windows10高
- php错误怎么开启_display_errors与
- Win11资源管理器卡顿怎么办 Win11文件资源
- 如何在Golang中操作嵌套切片指针_Golang
- 如何使用Golang实现容器安全扫描_Golang
- Flask 表单数据通过 SMTP 发送邮件的完整
- php485支持哪些操作系统_php485跨系统支
- Python对象生命周期管理_创建销毁解析【教程】
- Windows11怎么用“记事本”自动换行与编码
- Win11怎么关闭OneDrive同步_Win11
- Windows10怎么备份注册表_Windows1
- XAMPP 启动失败(Apache 突然停止)的终
- Windows10系统怎么查看运行时间_Win10
- 如何使用Golang管理模块版本_Golanggo
- Python类装饰器使用_元编程解析【教程】
- LINUX如何删除用户和用户组_Linux use
- 如何在Golang中处理二进制数据_Golang
- 短链接怎么用php递归还原_多层加密链接的处理法【
- 零基础学会Python自动化办公_高效处理Exce
- Win11无法拖拽文件到任务栏怎么办_Win11开
- Win11怎么关闭用户账户控制UAC_Window
- Win11蓝牙开关不见了怎么办_Win11蓝牙驱动
- Python文件和流处理指南_高效读写大体积数据文
- php报错怎么查看_定位PHP致命错误与警告的方法
- 如何使用Golang实现文件追加操作_向已有文件追
- Win10任务栏天气和资讯怎么关闭 Win10禁用


QQ客服