证书固定实战指南:防止中间人攻击

证书固定(Certificate Pinning)是一种安全加固技术,通过将网站的身份与特定的证书或公钥绑定,防止攻击者使用伪造证书进行中间人攻击(MITM)。本文详细介绍证书固定的工作原理、实现方式和实战配置。 什么是证书固定 传统 HTTPS 验证依赖证书链信任机制:由浏览器内置的根证书库验证网站证书是否由可信 CA 签发。然而,如果攻击者能控制用户的根证书(如通过恶意软件或某些网络审查工具),就可以使用任意 CA 签发的伪造证书实施中间人攻击。 证书固定的核心思想是:不仅验证证书是否可信,还验证证书是否是我们预期的那一个。通过预先在客户端保存服务器的公钥指纹或证书指纹,客户端只会接受固定的那个证书,其他任何证书(包括合法 CA 签发的)都会被拒绝。 固定方式 1. 公钥指纹固定 直接固定服务器的公钥指纹,这是最推荐的方式。公钥是证书中最稳定的部分,即使证书续期,只要不更换密钥,指纹就保持不变。 1 2 3 4 5 6 # 提取证书公钥并计算 SHA-256 指纹 openssl s_client -connect example.com:443 2>/dev/null | \ openssl x509 -pubkey -noout | \ openssl pkey -pubin -outform der | \ openssl dgst -sha256 -binary | \ base64 输出示例: 1 aqQ4L+Pac7Qy3Or7l6f9IypN8w1H64i48B4weiXJ2v4= 2. 证书指纹固定 直接固定整个证书的 SHA-256 指纹: 1 2 3 # 提取证书 SHA-256 指纹 openssl s_client -connect example....

May 6, 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 · 黑豆子

SSH 证书认证实战指南

SSH 证书认证是一种比传统公钥认证更安全的方案。本文介绍 SSH 证书的工作原理和配置方法。 传统公钥认证的问题 传统的 SSH 公钥认证需要在每台服务器上添加用户的公钥: 1 2 # 用户将公钥发送到服务器 ssh-copy-id user@server 这种方式在大规模环境中存在以下问题: 密钥管理困难:新增或撤销用户需要手动更新所有服务器 无时效性:公钥永久有效,离职后难以撤销 无法追踪:无法知道谁在什么时候登录过 扩展性差:成百上千台服务器时维护成本极高 SSH 证书认证的原理 SSH 证书认证引入**证书颁发机构(CA)**的概念: CA 密钥:管理员创建一个 CA 私钥,用于签发证书 用户证书:CA 使用私钥对用户公钥进行签名,生成证书 服务器信任 CA:服务器只需配置信任 CA 公钥,无需逐个添加用户公钥 证书验证:用户登录时提交证书,服务器通过 CA 公钥验证证书有效性 证书包含的信息 用户公钥 用户 ID(Key ID) 有效期(起始时间 + 结束时间) 允许的登录用户名(Principals) CA 签名 创建 SSH CA 首先创建 CA 密钥对。建议使用 ED25519 算法: 1 2 3 4 5 # 创建用户证书CA ssh-keygen -t ed25519 -f ~/.ssh/user_ca -C "SSH User CA" # 创建主机证书CA(可选,用于验证服务器身份) ssh-keygen -t ed25519 -f ~/....

April 29, 2026 · 3 min · 黑豆子

后量子密码学与 NIST PQC 标准化

量子计算的快速发展对现代密码学构成了前所未有的威胁。当前广泛使用的 RSA、ECDSA 等公钥密码算法依赖于大整数分解或离散对数问题的计算难度,但量子计算机的 Shor 算法可以在多项式时间内解决这些问题。这意味着当大规模量子计算机成熟时,现有的 SSL/TLS 证书、SSH 密钥、数字签名都将面临被破解的风险。 什么是后量子密码学 后量子密码学(Post-Quantum Cryptography,PQC)是指能够在经典计算机上运行,但能够抵御量子计算机攻击的密码学算法。这些算法不依赖量子力学原理,而是基于量子计算机也难以高效求解的数学问题,如格密码(Lattice-Based)、编码密码(Code-Based)、多变量密码(Multivariate)等。 与量子密钥分发(QKD)不同,PQC 是软件层面的解决方案,可以在现有硬件和网络上部署,无需专门的量子通信设备。 NIST PQC 标准化进程 美国国家标准与技术研究院(NIST)自 2016 年启动后量子密码学标准化项目,经过多轮筛选,于 2024 年 8 月发布了首批三个最终标准。 首批发布的三个标准 标准名称 类型 底层技术 用途 ML-KEM 密钥封装机制 模块格(Module-Lattice) 密钥交换、TLS 握手 ML-DSA 数字签名 模块格(Module-Lattice) 证书签名、代码签名 SLH-DSA 数字签名 哈希(Hash-Based) 替代签名方案 ML-KEM(原 Kyber)是基于格理论的密钥封装机制,将取代传统的 Diffie-Hellman 密钥交换,用于 TLS 1.3 握手阶段的密钥协商。 ML-DSA(原 Dilithium)是基于格理论的数字签名算法,将作为主要的签名方案,用于 SSL/TLS 证书、代码签名等场景。 SLH-DSA(原 SPHINCS+)是基于哈希的签名算法,作为备份方案,安全性基于哈希函数的抗碰撞性。 正在标准化的候选算法 除了首批三个标准,NIST 还在评估以下算法: Falcon:基于格的高效签名算法,签名更短,适用于带宽受限场景 HQC:基于编码的密钥封装机制,提供额外的安全保障 实际影响与迁移时间线 对 TLS/SSL 的影响 当前的 TLS 协议使用 RSA 或 ECDSA 进行身份验证,使用 ECDHE 进行密钥交换。迁移到 PQC 后:...

April 29, 2026 · 2 min · 黑豆子

证书透明度原理与验证

什么是证书透明度 证书透明度(Certificate Transparency,简称 CT)是 Google 提出的一个开源框架,旨在为 TLS 证书提供公开的审计和监控机制。它的核心目标是检测恶意或错误签发的证书,防止证书颁发机构(CA)未经授权签发证书。 在 CT 出现之前,如果某个 CA 被攻击或故意签发虚假证书,这些证书可能在很长时间内不被发现。CT 通过要求所有证书必须记录在公开的日志服务器上,使得任何人都可以审计证书签发行为。 CT 架构解析 证书透明度由三个核心组件构成: 1. 日志服务器(Log Server) 日志服务器是 CT 的核心,是一个仅追加(append-only)的 Merkle 树结构数据库。每个日志服务器接收并存储证书条目,主要特性: 仅追加:一旦记录被添加,就不能删除或修改 Merkle 树:使用密码学哈希树结构,可以高效验证数据完整性 公开可访问:任何人都可以提交证书或查询日志 主流的公开日志服务器包括: Google Argon(ct.googleapis.com/pki/argon) DigiCert Log(ct.digicert.com/log) Let’s Encrypt(ct.letsencrypt.org) 2. 监控器(Monitor) 监控器定期检查日志服务器,查找可疑的证书签发行为。例如: 为知名域名签发的异常证书 仿冒知名网站的证书 来自不可信 CA 的证书 常见的监控服务包括: crt.sh - 免费证书搜索数据库 Google Monitor Cloudflare Monitor 3. 审计员(Auditor) 审计员验证日志服务器的行为,确保它们: 正确记录了所有提交的证书 没有作弊或隐瞒记录 响应一致的查询 浏览器通常内置审计员功能,在验证证书时自动检查 SCT。 SCT:签名证书时间戳 当证书被提交到 CT 日志时,日志服务器会返回 Signed Certificate Timestamp(SCT)。SCT 包含: 日志服务器 ID:签发 SCT 的日志服务器标识 序列号:该证书在日志中的唯一编号 时间戳:证书被记录的时间 签名:日志服务器对上述信息的数字签名 浏览器在验证 TLS 连接时,会检查证书是否附带有效的 SCT。根据浏览器策略,通常要求至少 1-2 个 SCT 才能完全信任证书。...

April 28, 2026 · 2 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 检查证书有效期

证书过期会导致服务不可用,提前监控证书有效期是运维的基本功。OpenSSL 提供了多种检查证书有效期的方法。 检查远程服务器证书 查看有效期 1 echo | openssl s_client -connect www.baidu.com:443 -servername www.baidu.com 2>/dev/null | openssl x509 -noout -dates 输出: 1 2 notBefore=Jul 9 07:01:02 2025 GMT notAfter=Aug 10 07:01:01 2026 GMT notBefore:证书生效日期 notAfter:证书过期日期 检查本地证书文件 1 openssl x509 -in certificate.crt -noout -dates 查看剩余天数 1 openssl x509 -in certificate.crt -noout -checkend 0 输出: Certificate will not expire:证书未过期 Certificate will expire:证书已过期 检查是否在 30 天内过期(2592000 秒): 1 openssl x509 -in certificate.crt -noout -checkend 2592000 返回码:...

April 5, 2026 · 2 min · 黑豆子