OpenSSL 3.x 自定义 Engine 开发实战

本文介绍 OpenSSL 3.x 中自定义 Engine 的开发方法,帮助你实现硬件安全模块(HSM)集成、国密算法扩展等需求。 什么是 OpenSSL Engine? OpenSSL Engine 是 OpenSSL 密码学操作的可插拔后端实现。通过 Engine,你可以: 集成硬件安全模块(HSM) 使用国密算法(如 SM2/SM3/SM4) 调用专用的加密加速卡 实现自定义的密码学算法 查看可用 Engine 系统已内置多个 Engine,使用以下命令查看: 1 openssl engine -t 输出示例: 1 2 3 4 5 6 (dynamic) Dynamic engine loading support [ unavailable ] (padlock) VIA PadLock (no-RNG, no-ACE) [ unavailable ] (afalg) AFALG engine [ unavailable ] [ unavailable ] 表示该 Engine 在当前系统上不可用,但可以加载。 使用动态 Engine 加载 OpenSSL 支持动态加载自定义 Engine。创建一个简单的配置文件进行测试: 1 2 3 4 5 # 创建 Engine 配置目录 mkdir -p ~/....

June 27, 2026 · 3 min · 黑豆子

OpenSSL SSL_get_error 错误码详解

在 OpenSSL 编程中,SSL_get_error() 是排查 SSL/TLS 连接问题的核心函数。当 SSL_read() 或 SSL_write() 返回负数时,需要调用它来确定具体的错误类型。本文详细介绍各错误码的含义及处理方法。 函数原型 1 2 3 #include <openssl/ssl.h> int SSL_get_error(const SSL *ssl, int ret); ret 是上次 SSL 操作的返回值(通常为负数),函数返回以下错误码之一: 错误码 常量 含义 0 SSL_ERROR_NONE 操作成功完成 1 SSL_ERROR_SSL 协议层面的内部错误 2 SSL_ERROR_WANT_READ 操作未完成,需要更多数据 3 SSL_ERROR_WANT_WRITE 操作未完成,需要写入更多数据 4 SSL_ERROR_WANT_X509_LOOKUP 等待 X509 回调完成 5 SSL_ERROR_SYSCALL 系统调用错误,检查 errno 6 SSL_ERROR_ZERO_RETURN 对端关闭连接 7 SSL_ERROR_WANT_CONNECT 等待连接完成 8 SSL_ERROR_WANT_ACCEPT 等待 Accept 完成 9 SSL_ERROR_WANT_ASYNC 等待异步操作 10 SSL_ERROR_WANT_ASYNC_JOB 等待异步任务 11 SSL_ERROR_WANT_CLIENT_HELLO_CB 等待 ClientHello 回调 12 SSL_ERROR_WANT_RETRY_VERIFY 等待重试验证 常见错误码详解 SSL_ERROR_SSL (1) 这是最常见的错误,表示协议层面的内部错误。通常由以下原因导致:...

June 23, 2026 · 4 min · 黑豆子

OpenSSL speed 命令实战:加密算法性能基准测试

openssl speed 是 OpenSSL 官方提供的加密算法性能基准测试工具。通过它可以了解不同加密算法在当前硬件上的处理速度,从而为生产环境选择合适的加密算法提供数据支撑。 基本用法 1 openssl speed [options] [algorithm...] 常用选项: -seconds N — 测试持续时间(默认 10 秒) -bytes N — 测试缓冲区大小(默认 16KB) -evp name — 使用 EVP 接口测试指定算法 -elapsed — 使用 wall-clock 时间而非 CPU 时间 -mr — 产生机器可读的输出 对称加密算法性能测试 测试 AES-256-GCM 1 2 3 4 5 6 7 8 9 10 $ openssl speed -seconds 1 -evp aes-256-gcm Doing AES-256-GCM for 1s on 16 size blocks: 1502986 AES-256-GCM's in 1....

June 17, 2026 · 3 min · 黑豆子

Nginx TLS 证书热更新与无损 reload 配置

在生产环境中,更新 TLS 证书是一个常见但敏感的操作。如果直接重启 Nginx 服务,会导致连接中断,影响用户体验。本文介绍如何在 Nginx 中实现 TLS 证书的热更新,在不中断服务的情况下完成证书更新。 什么是证书热更新? 证书热更新(Hot Reload)是指在不停止服务的情况下,重新加载新的证书文件。Nginx 支持通过发送 reload 信号来实现配置和证书的平滑重新加载。 与完全重启(nginx -s stop 然后 nginx)相比,reload 的优势在于: 不会中断正在处理的请求 平滑过渡,新连接使用新证书,旧连接继续使用旧证书 服务可用性不受影响 Nginx reload 机制 Nginx 支持以下几种信号: nginx -s reload - 平滑重新加载配置 kill -HUP <master_pid> - 发送 HUP 信号,作用与 reload 相同 kill -USR1 <master_pid> - 重新打开日志文件 kill -USR2 <master_pid> - 优雅升级(用于升级 Nginx 二进制文件) 当 Nginx 收到 reload 信号时: 主进程(Master Process)解析新的配置文件 如果配置合法,主进程启动新的工作进程(Worker Process) 旧的工作进程优雅退出(处理完现有连接后关闭) 新的工作进程使用新的证书 证书热更新操作步骤 1. 准备新的证书文件 首先,将新的证书和私钥文件复制到指定目录:...

June 10, 2026 · 4 min · 黑豆子

OpenSSL dhparam 命令详解:生成和验证 DH 参数

在使用 Diffie-Hellman(DH)密钥交换实现前向保密(PFS)时,DH 参数是必不可少的基础组件。本文详细介绍 OpenSSL dhparam 命令的用法,帮助你生成、验证和管理 DH 参数。 什么是 DH 参数? DH 密钥交换的安全性依赖于两个数学参数:大素数 P 和生成元 G。这两个参数构成 DH 参数组,决定了密钥交换的安全强度。 P(素数):一个安全的大素数,作为模数 G(生成元):一个整数,用于生成密钥交换所需的数学运算 基本用法 生成 DH 参数 生成指定位数的 DH 参数是最常用的操作: 1 2 # 生成 2048 位 DH 参数 openssl dhparam -out dhparam.pem 2048 这个命令会生成一个 2048 位的安全素数参数组。生成过程可能需要一些时间,因为需要找到合适的素数。 使用不同生成元 默认情况下,OpenSSL 使用生成元 2。你可以指定其他生成元(2、3 或 5): 1 2 3 4 5 6 7 8 # 使用生成元 2(默认) openssl dhparam -out dhparam.pem -2 2048 # 使用生成元 3 openssl dhparam -out dhparam....

June 5, 2026 · 3 min · 黑豆子

SSH 密钥轮换完整指南

SSH 密钥轮换是安全运维中的重要实践。本文将介绍为什么需要轮换 SSH 密钥,以及如何实现安全、便捷的密钥轮换方案。 为什么要轮换 SSH 密钥 长期使用同一个 SSH 密钥会带来以下风险: 密钥泄露风险:密钥可能通过各种途径泄露(备份泄漏、离职人员带走等) 密钥老化:长时间使用的密钥可能被暴力破解或通过其他方式破解 合规要求:许多安全标准和合规要求强制定期更换认证凭据 最小权限原则:定期轮换可以确保只有当前需要访问的用户持有有效密钥 手动轮换流程 1. 生成新密钥 1 2 3 4 5 # 使用 Ed25519 算法(推荐) ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_new -C "your-email@example.com" # 或使用 RSA(如果需要兼容旧系统) ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_new -C "your-email@example.com" 2. 分发公钥到服务器 1 2 3 4 5 6 7 # 方式一:使用 ssh-copy-id ssh-copy-id -i ~/.ssh/id_ed25519_new.pub user@server # 方式二:手动添加到远程服务器的 authorized_keys ssh user@server "mkdir -p ~/.ssh && chmod 700 ~/....

June 2, 2026 · 3 min · 黑豆子

TLS 指纹识别与 JA3/JA4 指南

TLS 指纹识别是一种通过分析 TLS 握手过程中的参数来识别客户端或服务器的技术。与传统的 IP 地址或端口识别不同,TLS 指纹更加稳定,即使攻击者更换 IP 地址,也能通过指纹识别出来。 什么是 TLS 指纹? TLS 指纹(TLS Fingerprint)是基于 TLS 握手过程中的特定参数生成的唯一标识。这些参数包括: TLS 版本:如 TLS 1.2、TLS 1.3 密码套件列表:客户端支持的密码套件顺序 扩展列表:支持 TLS 扩展 支持的群(TLS 1.3)或椭圆曲线(TLS 1.2) 签名算法 不同的 TLS 库和应用程序在握手时会发送不同的参数组合,这使得它们可以被识别。 JA3 与 JA4 的区别 JA3 JA3 是由 Salesforce 开发的 TLS 指纹方法,格式为: 1 TLSVersion,CipherSuites,Extensions,EllipticCurves,SignatureAlgorithms 示例: 1 771,4865-4866-4867-49195-49199-49171-49172-156-157-47-53,0-23-65281-16-22-35,29-23-24,0 然后对整个字符串进行 MD5 哈希,生成 32 字符的十六进制指纹: 1 1ab209a4577159577b15884bde700eaf JA4 JA4 是较新的指纹方法,由 Salesforce 在 2024 年推出,格式更加详细: 1 2 3 4 5 6 JA4<a><b><c><d> - a: TLS 版本 (如 13 表示 TLS 1....

May 30, 2026 · 2 min · 黑豆子

OpenSSL s_server 命令:快速搭建测试 TLS 服务器

在调试 TLS 配置或测试客户端证书时,我们经常需要一个临时的 HTTPS 服务器。OpenSSL 提供的 s_server 命令可以快速启动一个测试 TLS 服务器,无需复杂的配置。 本文将详细介绍 s_server 的各种用法,帮助你在调试和测试中提高效率。 快速启动 HTTPS 服务器 最简单的用法 只需要指定证书和私钥文件,即可启动一个 HTTPS 服务器: 1 openssl s_server -cert server.crt -key server.key -www 启动后,访问 https://localhost:4433/ 会看到一个状态页面,显示服务器支持的 TLS 版本和密码套件。 如果你没有现成的证书,可以快速生成一个自签名证书: 1 2 # 生成测试用证书 openssl req -x509 -newkey rsa:2048 -keyout server.key -out server.crt -days 365 -nodes -subj "/CN=Test Server" 常用端口和地址 默认端口是 4433。如果需要使用标准 HTTPS 端口 443,需要 root 权限: 1 2 3 4 5 # 监听 443 端口(需要 root 权限) openssl s_server -cert server....

May 29, 2026 · 3 min · 黑豆子

ACME 协议与自动化证书管理实战

深入解析 ACME 协议工作原理,详解 Let’s Encrypt 免费证书申请与 Certbot 自动续期配置,实现 HTTPS 证书自动化管理。

May 28, 2026 · 5 min · 黑豆子

使用 SSLKEYLOGFILE 在 Wireshark 中解密 TLS 流量

在排查 HTTPS 连接问题时,能够解密 TLS 流量是极其重要的技能。Wireshark 支持通过 SSLKEYLOGFILE 方式解密 TLS 流量,本文详细介绍其工作原理和实操步骤。 工作原理 TLS 加密通信的安全性来自密钥交换过程。如果能够获取客户端和服务端协商出的密钥(Master Secret 或 Traffic Keys),就能解密捕获的 TLS 流量。 SSLKEYLOGFILE 是 NSS 密码库引入的一个特性,被 Chrome、Firefox、curl 等支持。客户端在建立 TLS 连接时,会将密钥材料写入指定文件,Wireshark 读取该文件即可解密流量。 ⚠️ 注意:本文仅用于调试自己的 TLS 连接。请勿用于窃听他人通信。 前置要求 Wireshark(支持 TLS 1.2 和 TLS 1.3 解密) 支持 SSLKEYLOGFILE 的客户端(如 Chrome、Firefox、curl、OpenSSL s_client) 环境准备 1. 创建 Keylog 文件 1 2 3 # 创建空文件用于存储密钥 touch ~/ssl-keylog.txt chmod 600 ~/ssl-keylog.txt 2. 配置环境变量 在 Linux/macOS 上: 1 export SSLKEYLOGFILE=~/ssl-keylog.txt 在 Windows 上(PowerShell):...

May 19, 2026 · 2 min · 黑豆子