验证类型:OpenSSL CLI 本机回环 TLS1.3 实际握手及早期数据交付,不是 HTTP 或公网生产实验。 运行:python3 lab.py > run.jsonl;标准库 Python 驱动 /opt/homebrew/bin/openssl 3.6.2。macOS 27.0 arm64。 所有连接仅固定本次 127.0.0.1 随机端口,使用专用临时根 CA 与 SAN server.lab.test 的直接签名叶证书;客户端 -verify_hostname server.lab.test -verify_return_error -CAfile root.pem -no-CApath -no-CAstore,关闭默认信任目录和证书存储。双方 -tls1_3。 服务端显式 -anti_replay,-early_data -max_early_data1024 -recv_max_early_data1024 -num_tickets2 -naccept3。不是仅假定默认配置;从未关闭 anti_replay。参数的实际独立 argv 原样保存在 run.jsonl。 第0连接:New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384;Verification:OK;Verified peername:server.lab.test;Early data was not sent。持续读取直至 session0.pem 产生,然后 stdin EOF 正常结束。 第1连接:用 session0.pem,实际 Reused, TLSv1.3,同套件,Early data was not sent。该恢复连接新产生的 session1.pem 留给下一连接。 第2连接:使用未在其他连接消费的 session1.pem,-early_data early.txt;实际 Reused, TLSv1.3,Early data was accepted;服务端真实输出 LAB25-EARLY-SAFE(固定16字节含换行)。该文本无业务副作用。 三次客户端正常 exit0,服务端三次接受后 exit0;最终断言检查 New/Reused、第三连接accepted与服务端实际文本,不以票据文件存在或参数代替验收。 没有读取或发布 ticket/PSK 内容。所有 session*.pem、私钥、原始客户端/服务端日志在 TemporaryDirectory。公开日志只通过前缀白名单提取摘要(New/Reused/验证结论/早期数据状态/固定测试文本);未逐行公开全部原始输出。证书生成命令及公开叶证书文本可留。 第一次运行在得到票据后 SIGTERM 客户端,stdout摘要未刷新,New断言失败;并未据此判定协议握手失败。改为 -no_ign_eof、读取票据后关闭stdin并等待进程正常退出,第二轮成功。随后补完整验收断言及显式anti_replay;一次自动权限审查超时且未执行,按工具允许重试一次后最终完整成功。run.jsonl仅最终轮。 每条 OpenSSL 命令有限超时;服务启动和票据等待有单调deadline,进程finally终止/等待,临时目录自动清理。临时端口从本机bind0选出后交给s_server,存在释放与重新绑定间隔;冲突时失败退出,不访问其他上游。 CLI --help exit0、--self-check exit0、--invalid exit2;自检仅白名单排除合成SECRET,不是TLS证明。Python规则检查零违规,未安装额外工具,不声称LSP类型检查。 范围:未对重复票据重放、集群共享状态、分布式防重放作验证;开启anti_replay不等于应用exactly-once。未验证HTTP425、应用自动重试、0RTT延迟/性能收益、逐握手消息/密钥派生、TCP层RTT数或公网环境。服务端文本可能先于“Early data received”标题输出,日志不据此推断密码学处理顺序。 脚本只负责受控三连接验收;固定端点、固定无副作用文本、无通用框架、无新增依赖。原始秘密不在日志返回值;未使用Any/cast/忽略类型错误。 一手参考:当次OpenSSL本机s_client/s_server帮助;https://docs.openssl.org/3.6/man1/openssl-s_client/ 、https://docs.openssl.org/3.6/man1/openssl-s_server/ ,RFC8446§2.2/2.3/4.6.1/8(官方文档核查由本任务资料代理提供)。 父级独立复跑:显式加入-no-CApath/-no-CAstore后,New→Reused→Reused、accepted、服务端16字节文本、四进程exit0和临时目录清理全部通过;run.jsonl更新为该最终复跑。