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 应用安全修复后),均需要重复上述过程。

课后习题

  1. 使用 openssl speed 命令在本地 FreeBSD 系统上分别测试 AES-128-CBC、AES-256-GCM 和 ChaCha20-Poly1305 三种加密算法的吞吐量,分析结果差异的原因。

  2. openssl s_client -connect 连接一个公网 HTTPS 站点,从输出中提取证书链、协议版本和协商的密码套件,绘制证书的信任链结构图。

  3. 使用 openssl req -x509 生成一个自签名证书,随后配置 FreeBSD 上的 Nginx 或 Apache 使用该证书提供 HTTPS 服务。

最后更新于