For the complete documentation index, see llms.txt. This page is also available as Markdown.

27.5 OpenSSL

OpenSSL 3 自 FreeBSD 14 起纳入基本系统,引入提供者模块(provider module)架构。本节介绍自签证书生成(自签 CA)、FIPS 合规配置(fips_module 完整性检查与 openssl fipsinstall)和已弃用算法加载。

OpenSSL 3 提供者模块架构:

  应用程序(openssl 命令 / 第三方程序)
     
       调用 libcrypto
     
  libcrypto(核心加密库)
     
       按需加载提供者模块
     
  提供者模块
     
     ├── default:默认算法集(活跃)
           AES、SHA、RSA、ECDSA 等现代算法
     
     ├── legacy:已弃用算法(按需加载)
           MD2、MD4、RC4、DES 等旧算法
     
     └── fips:FIPS 140 合规算法集(按需加载)
           严格限定于 FIPS 标准允许的密码算法
           须经 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 命令设置权限:证书(.crt)为公开信息应设为 0644,私钥(.key)应设为 0600

配置 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 库复制到对应位置。

警告

FIPS 模块跨大版本混用风险:以下操作将 Ports 中的 OpenSSL 3.0 FIPS 模块复制到基本系统路径,与基本系统的 OpenSSL 3.5 混用。这种跨大版本(3.0 至 3.5)混用存在以下严重风险:

  • ABI 不兼容:不同大版本的 OpenSSL 内部数据结构与函数接口可能不兼容,导致程序崩溃或行为异常。

  • FIPS 认证失效:FIPS 140 验证针对特定版本组合颁发,跨大版本混用将导致 FIPS 合规性在法律和技术层面均不成立。

  • 安全隐患:旧版 FIPS 模块可能缺失新版 OpenSSL 的安全修复,混用后可能引入已知漏洞。

若要合规使用 FIPS 模块,应确保 FIPS 模块与 OpenSSL 库版本严格匹配。若不确定版本兼容性,请勿执行以下操作。

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 服务。

最后更新于