TLS 1.3 预共享密钥(PSK)实战指南

预共享密钥(PSK,Pre-Shared Key)是 TLS 1.3 引入的重要特性,允许通信双方在握手前共享对称密钥,简化握手流程并提升性能。本文详细介绍 PSK 的原理、使用场景以及 OpenSSL 命令行实战。 什么是 PSK? PSK 是一种在 TLS 握手前就共享的对称密钥。在传统 TLS 握手过程中,客户端和服务端需要通过公钥密码学协商出共享密钥;而使用 PSK 时,双方直接使用预先共享的密钥进行加密通信。 PSK 的优势 减少握手延迟:省去公钥协商步骤,缩短握手时间 降低计算开销:无需执行昂贵的非对称加密运算 适用于特定场景:物联网设备、CDN 加速等对性能要求高的场景 PSK 的使用场景 会话恢复(Session Resumption):TLS 会话恢复本质上使用 PSK 物联网设备:计算资源受限的设备间安全通信 CDN 边缘节点:需要快速建立大量连接的场景 内部服务通信:在可信网络中使用对称密钥 PSK 密钥生成 PSK 密钥通常是 256 位(32 字节)的随机数据。使用 OpenSSL 生成: 1 2 # 生成 256 位 PSK 密钥(32 字节 = 64 个十六进制字符) openssl rand -hex 32 输出示例: 1 779cfa0b22020c13ae4e841e0c96b1b90b3afa48f6bcb85192f1694156676aac ⚠️ 注意:PSK 密钥必须安全存储和传输,不要在代码中硬编码或通过网络明文传输。 OpenSSL s_client PSK 测试 基础连接测试 使用 PSK 连接到支持 PSK 的服务器:...

May 8, 2026 · 2 min · 黑豆子

SNI 原理与安全考量:TLS 扩展详解

什么是 SNI? SNI(Server Name Indication,服务名称指示) 是 TLS 协议的一个扩展,允许客户端在 TLS 握手开始时提前声明要访问的服务器域名。这一看似简单的机制,彻底解决了 HTTPS 早期的核心痛点——单 IP 多域名 问题。 为什么需要 SNI? 在 SNI 出现之前,TLS 握手存在一个困境: 客户端发送 ClientHello 消息时,还没有指定要访问的具体域名 服务器收到 ClientHello 后,无法确定客户端想要哪个虚拟主机 服务器只能返回一个"默认"证书,无法为每个域名提供正确证书 这意味着: 一个 IP 地址只能部署一个 HTTPS 网站 要托管多个 HTTPS 网站,必须为每个网站分配独立 IP SNI 的出现改变了这一局面。客户端在 ClientHello 中直接携带 server_name 扩展,声明目标域名,服务器据此返回对应证书。 工作原理 TLS 握手中的 SNI SNI 作为 TLS 扩展(Extension),在 ClientHello 消息中发送: 1 2 3 4 5 6 7 8 9 ClientHello ├── Version: TLS 1.2 / TLS 1....

May 5, 2026 · 2 min · 黑豆子

私有 CA 与内部证书颁发实战指南

在企业内网、测试环境或私有服务中,使用公共 CA 签发的证书不仅成本高昂,还可能带来安全风险。搭建私有 CA(Certificate Authority)可以完全掌控证书生命周期,实现内部服务的 HTTPS 加密和双向认证(mTLS)。本文将详细介绍如何使用 OpenSSL 搭建私有 CA 并签发内部证书。 什么是私有 CA 私有 CA 是组织内部自行搭建和维护的证书颁发机构,与 Let’s Encrypt、DigiCert 等公共 CA 类似,但不向外部公开。私有 CA 通常用于: 内网 HTTPS:内部系统之间的安全通信 开发测试:模拟生产环境的 HTTPS 流程 mTLS 双向认证:验证客户端和服务端双方身份 物联网设备:无法访问公共 CA 的嵌入式设备 搭建私有 CA 架构 典型的私有 CA 采用两级结构: 根 CA(Root CA):信任的起点,长期有效(10-20 年),离线存储 颁发 CA(Issuing CA):实际签发终端证书,有效期较短(1-3 年) 这种设计更安全:根 CA 离线保存,日常签发由颁发 CA 完成,泄露风险更低。 创建根 CA 根 CA 是整个 PKI 体系的信任根基,需要妥善保管。 1. 生成根 CA 私钥 1 openssl genrsa -out root-ca.key 4096 生成 4096 位 RSA 私钥。私钥必须严格保密,建议设置文件权限为 600。...

May 2, 2026 · 4 min · 黑豆子

OpenSSL verify 命令详解:证书链验证实战

openssl verify 是 OpenSSL 中最常用的证书验证工具,用于验证证书链的完整性和有效性。本文详细介绍其常用选项和实战场景。 基本语法 1 openssl verify [options] certificate.pem 常用选项 指定可信 CA 选项 说明 -CAfile <file> 指定一个包含可信 CA 证书的文件 -CApath <dir> 指定可信 CA 证书目录(需要哈希索引) -CAstore <uri> 从 URI 加载可信证书 1 2 3 4 5 # 使用 CAfile 验证 openssl verify -CAfile ca.crt server.crt # 同时使用 CAfile 和 CApath openssl verify -CAfile ca.crt -CApath /etc/ssl/certs server.crt 指定中间证书 1 2 # -untrusted 指定中间证书(证书链中的非可信证书) openssl verify -CAfile root.crt -untrusted intermediate.crt server.crt 常用验证选项 选项 说明 -partial_chain 接受部分链验证(只要链到某个可信 CA 即可) -show_chain 显示完整的证书链信息 -purpose <purpose> 验证证书用途(sslserver, sslclient, etc....

April 30, 2026 · 3 min · 黑豆子

OCSP Stapling 详解:原理、配置与排查

什么是 OCSP Stapling OCSP Stapling(正式名称为 TLS Certificate Status Request)是一种 TLS 扩展机制,允许服务端在 TLS 握手过程中主动向客户端提供证书的状态信息,而无需客户端自行向 CA 的 OCSP 响应服务器发起查询。 它的核心价值在于:将证书状态验证的责任从客户端转移到服务端,同时保护用户隐私、提升连接速度。 为什么需要 OCSP Stapling 要理解 OCSP Stapling 的价值,先看没有它时证书撤销检查的三种方式。 方式一:CRL(证书吊销列表) CA 定期发布一个包含所有已吊销证书序列号的列表(CRL),客户端下载后自行检查。 1 2 # 查看 CRL 分布点(CRL Distribution Points) openssl x509 -in cert.pem -noout -text | grep -A2 "CRL Distribution" 问题很明显:CRL 文件会随着时间不断增长,下载和解析开销越来越大。即使使用增量 CRL(Delta CRL),也难以应对大规模部署。 方式二:OCSP(在线证书状态协议) 客户端直接向 CA 的 OCSP 响应服务器发送查询,获取单张证书的实时状态。 1 2 3 # 提取证书的 OCSP 响应器 URL openssl x509 -in cert.pem -noout -ocsp_uri # 示例输出: http://ocsp....

April 21, 2026 · 6 min · 黑豆子

OCSP 证书状态在线检查

OCSP(Online Certificate Status Protocol)是用于实时检查证书是否被吊销的协议。相比 CRL,OCSP 无需下载完整吊销列表,查询效率更高。本文介绍 OCSP 原理及 OpenSSL 命令行操作。 什么是 OCSP? 当浏览器验证 TLS 证书时,除了检查证书链和有效期,还需确认证书未被吊销。传统方式是下载 CRL(Certificate Revocation List),但列表会随时间增长。OCSP 允许客户端直接查询证书颁发机构,获取特定证书的实时状态。 OCSP 响应类型 状态 含义 good 证书有效,未被吊销 revoked 证书已被吊销 unknown 响应者不知道该证书 从证书提取 OCSP 信息 获取证书的 OCSP 响应者地址 1 openssl x509 -in certificate.crt -noout -ocsp_uri 输出示例: 1 http://ocsp.digicert.com 获取颁发者信息 OCSP 查询需要知道证书的颁发者(CA): 1 2 3 4 5 # 获取证书颁发者 openssl x509 -in certificate.crt -noout -issuer # 获取颁发者证书 openssl x509 -in certificate.crt -noout -issuer_hash 实际 OCSP 查询示例 使用 OpenSSL 进行 OCSP 查询 1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 获取目标证书和颁发者证书 openssl s_client -connect google....

April 16, 2026 · 3 min · 黑豆子

双向 TLS 认证实战指南

什么是双向 TLS 认证 普通 HTTPS 连接中,客户端验证服务器证书,确保连接的是真实的服务器。双向 TLS(Mutual TLS,简称 mTLS) 在此基础上增加了服务器对客户端的验证——客户端必须提供有效的证书才能建立连接。 这种认证方式比用户名密码更安全,广泛用于: API 服务间的身份认证 零信任网络架构 企业内部系统访问控制 高安全要求的金融、医疗系统 工作原理 mTLS 握手过程: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 客户端 服务器 | | |---------- ClientHello --------------->| |<--------- ServerHello ----------------| |<--------- Certificate ----------------| (服务器证书) |<--------- CertificateRequest ---------| (请求客户端证书) |<--------- ServerHelloDone ------------| | | |---------- Certificate ---------------->| (客户端证书) |---------- ClientKeyExchange --------->| |---------- CertificateVerify --------->| (证明拥有私钥) |---------- Finished ------------------>| |<--------- Finished -------------------| | | |====== 加密通信通道 ====================| 关键区别:服务器发送 CertificateRequest,客户端响应自己的证书并用私钥签名证明身份。...

April 11, 2026 · 3 min · 黑豆子

OpenSSL passwd 命令:生成密码哈希

OpenSSL passwd 命令用于生成 Unix 密码哈希,支持 SHA-512、SHA-256、MD5 等算法,适用于系统管理和脚本场景。

April 10, 2026 · 2 min · 黑豆子

OpenSSL rand 命令详解:随机数生成

随机数是密码学的基石。密钥、IV、盐值、Session ID 等都需要高质量的随机数。OpenSSL 的 rand 命令是生成密码学安全随机数的实用工具。 基本语法 1 openssl rand [选项] 字节数 常用选项: -hex:输出十六进制格式 -base64:输出 Base64 编码格式 -out <文件>:输出到文件 常用示例 生成十六进制随机数 1 2 # 生成 16 字节(128 位)的十六进制随机数 openssl rand -hex 16 输出示例: 1 5254ce50aaf9b31ae6c6ecf2ef75f4de 生成 Base64 随机数 1 2 # 生成 32 字节(256 位)的 Base64 随机数 openssl rand -base64 32 输出示例: 1 n8EZAZAQ4PL60cFHcP0KIeT8dlhsa8m1K8QP1dQVnlQ= 生成不同长度的随机数 1 2 3 4 5 6 7 8 9 10 # 8 字节(64 位) openssl rand -hex 8 # 输出:67194de56e50d52b # 32 字节(256 位) openssl rand -hex 32 # 输出:7be8420779779ecd1253f6be94e7d717b9a75e7aa5d0767c95414e8f811d6b29 # 64 字节(512 位) openssl rand -hex 64 实战场景 1....

April 8, 2026 · 3 min · 黑豆子

OpenSSL enc 文件加密实战

使用 OpenSSL enc 命令进行文件对称加密,包括密码加密、密钥文件加密、Base64 编码等实战场景。

April 7, 2026 · 2 min · 黑豆子