21.7 OpenSSL
OpenSSL 3 自 FreeBSD 14 起纳入基本系统,引入提供者模块(provider module)架构。本节介绍自签证书生成(自签 CA)、FIPS 合规配置(fips_module 完整性检查与 openssl fipsinstall)和已弃用算法加载。
概述
OpenSSL 是加密工具包,实现安全套接字层(SSL)和传输层安全(TLS)网络协议,并提供丰富的加密例程。
openssl 程序是该工具包的命令行入口,用户可在 Shell 中调用 OpenSSL 加密库的各类功能,包括:
私钥、公钥和参数的创建与管理
公钥加密操作
X.509 证书、CSR 和 CRL 的创建
消息摘要与消息认证码的计算
使用密码进行加密和解密
SSL/TLS 客户端和服务器测试
S/MIME 签名或加密邮件的处理
时间戳请求、生成和验证
加密例程的性能测试
更多信息请参阅免费的 OpenSSL Cookbook。
生成证书
OpenSSL 支持生成证书,可提交 CA 验证,也可以自行使用。具体而言:
需要 CA 签署的证书签名请求
执行 openssl 搭配以下参数,可生成供 CA 签署的证书:
解释命令选项:
openssl req
生成证书签名请求(CSR,Certificate Signing Request)
-new
创建新的证书签名请求
-noenc
不为私钥设置密码,生成的私钥不会加密保护
-out req.pem
指定生成的证书签名请求文件的输出文件名,这里是 req.pem
-keyout cert.key
指定生成的私钥文件的输出路径,这里是 cert.key
-sha512
使用 SHA-512 哈希算法进行签名请求的哈希计算
-newkey rsa:4096
生成新的 RSA 密钥对,使用 4096 位的 RSA 加密算法。
输出应类似于以下内容:
上述命令生成的是证书签名请求(CSR),需提交给 CA 签署后方可获得证书。
该命令在当前目录创建了两个文件:
将证书请求文件 req.pem 递交至 CA,由 CA 验证凭据、签署后返回已签名证书;
另一文件 cert.key 为证书私钥,务必妥善保管。私钥一旦泄露,他人即可冒充用户或服务器。
自签名证书
如果无需 CA 签署,可自行创建自签名证书。
警告
以下命令将证书和私钥直接写入
/etc/ssl/系统目录。若该路径下已有证书文件,将被覆盖且无法恢复。请先备份现有证书。
执行以下命令生成 X.509 格式的自签名证书:
输出应类似于以下内容:
此命令将在目录 /etc/ssl/certs 下创建证书文件 cert.crt。
可执行如下命令进行验证:
证书私钥 cert.key 位于 /etc/ssl/ 目录:
验证私钥:
如果 SHA-256 值相同,则说明私钥与证书匹配。
建议将上述文件存放于 /etc/ssl/ 目录,使用 chmod 命令将权限设为 0700(仅 root 可读)。
配置 FIPS 提供者
OpenSSL 3 自 FreeBSD 14 起纳入基本系统,随之而来的还有全新的提供者模块(provider module)概念。
除内置默认提供者外,legacy 模块负责实现现已可选、已弃用的加密算法,fips 模块则严格限定于 FIPS 标准允许的密码算法集。
OpenSSL 的 FIPS 相关部分受到重点关注,附有已知安全问题列表,并定期接受 FIPS 140 验证流程审查。这些措施使用户得以确保满足 FIPS 合规要求。
fips_module 还受额外安全机制保护,未通过完整性检查则无法使用。本地系统管理员可按需配置此检查,继而允许每个 OpenSSL 3 用户加载该模块。如果配置不当,FIPS 模块报错如下:
输出应类似于以下内容:
可通过创建 /etc/ssl/fipsmodule.cnf 来配置完整性检查,并在 OpenSSL 主配置文件 /etc/ssl/openssl.cnf 中引用。
需要通过 Ports 参照 FIPS 已验证版本清单安装经过认证的 OpenSSL 版本。随后将 fips.so 库复制到对应位置。
警告
以下操作将 Ports 中的 OpenSSL 3.0 FIPS 模块复制到基本系统路径。Ports 的 OpenSSL 3.0 与基本系统的 OpenSSL 3.5 存在 ABI 差异,此操作可能导致兼容性问题。建议仅在明确需要 FIPS 认证的场景下执行,并注意版本匹配。
OpenSSL 提供了 openssl fipsinstall 辅助此过程。用法如下:
输出应类似于以下内容(版本号取决于 Ports 中安装的 OpenSSL 版本):
接下来应修改 /etc/ssl/openssl.cnf,加入以下三项配置:
引入上面生成的 /etc/ssl/fipsmodule.cnf 文件,
导出 FIPS 模块以供调用,
并显式激活默认模块。
以上步骤完成后,即可确认 FIPS 模块确实可用且正常工作:
输出应类似于以下内容:
查看当前 OpenSSL 提供者状态:
以上输出中,default 提供者的版本号取决于系统使用的 OpenSSL 版本(基本系统或 Ports),FIPS 提供者的版本号取决于 Ports 中安装的 OpenSSL 版本。
FIPS 模块发生变动时(如系统更新后,或基本系统 OpenSSL 应用安全修复后),均需要重复上述过程。
课后习题
使用
openssl speed命令在本地 FreeBSD 系统上分别测试 AES-128-CBC、AES-256-GCM 和 ChaCha20-Poly1305 三种加密算法的吞吐量,分析结果差异的原因。用
openssl s_client -connect连接一个公网 HTTPS 站点,从输出中提取证书链、协议版本和协商的密码套件,绘制证书的信任链结构图。使用
openssl req -x509生成一个自签名证书,随后配置 FreeBSD 上的 Nginx 或 Apache 使用该证书提供 HTTPS 服务。
最后更新于