UP | HOME

OpenSSL

Table of Contents

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 https://www.feistyduck.com/books/openssl-cookbook/ 

生成证书

OpenSSL 支持生成证书,可提交 CA 验证,也可以自行使用。具体而言:

需要 CA 签署的证书签名请求

执行 openssl 搭配以下参数,可生成供 CA 签署的证书:

$ openssl req -new -noenc -out req.pem -keyout cert.key -sha512 -newkey rsa:4096

解释命令选项:

Table 1: 命令选项
选项 解释
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 加密算法

输出应类似于以下内容:

...+......+.......+.....+.+.....+....+...+..+++++++++++++++++++++++++++++++++++++++++++++*.........+++++++++++++++++++++++++++++++++++++++++++++*..+................+....+......+.....+++++

……省略部分输出……

-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN # 国家和地区两位编码
State or Province Name (full name) [Some-State]:Beijing # 省或州
Locality Name (eg, city) []:Beijing     # Organization Name (eg, company) [Internet Widgits Pty Ltd]:Chinese FreeBSD Community (CFC) # 组织名称
Organizational Unit Name (eg, section) []:Systems Administrator # 组织单位名称
Common Name (e.g. server FQDN or YOUR name) []:bsdcn.org # 公用名
Email Address []:ykla@bsdcn.org # 电子邮件

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:1234 # 密码不少于四位数
An optional company name []:1234
上述命令生成的是证书签名请求(CSR),需提交给 CA 签署后方可获得证书

该命令在当前目录创建了两个文件:

  1. req.pem: 将证书请求文件 req.pem 递交至 CA,由 CA 验证凭据、签署后返回已签名证书
  2. cert,key: 另一文件 cert.key 为证书私钥,务必妥善保管

    私钥一旦泄露,他人即可冒充用户或服务器
    

自签名证书

如果无需 CA 签署,可自行创建自签名证书

以下命令将证书和私钥直接写入 /etc/ssl/ 系统目录

若该路径下已有证书文件,将被覆盖且无法恢复。请先备份现有证书

执行以下命令生成 X.509 格式的自签名证书:

$ openssl req -new -x509 -days 365 -sha512 -keyout /etc/ssl/cert.key -out /etc/ssl/certs/cert.crt

输出应类似于以下内容:

.+...+.....+.......+...+............+......+.....+.......+++++++++++++++++++++++++++++++++++++++*.+........+...+....+.................+...+...+++++++++++++++++++++++++++++++++++++++*..............+............+........+.........+.+

……省略部分输出……

Enter PEM pass phrase: # 设置密码
Verifying - Enter PEM pass phrase: # 再次输入密码
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Beijing
Locality Name (eg, city) []:Beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Chinese FreeBSD Community (CFC)
Organizational Unit Name (eg, section) []:Systems Administrator
Common Name (e.g. server FQDN or YOUR name) []:bsdcn.org
Email Address []:ykla@bsdcn.org

此命令将在目录 /etc/ssl/certs 下创建证书文件 cert.crt

-rw-r--r--  1 root wheel 1521 Apr 16 11:53 cert.crt

可执行如下命令进行验证:

$ openssl x509 -in /etc/ssl/certs/cert.crt -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
4d:b3:2e:fa:d1:6d:59:a7:c5:f6:15:a2:44:3c:63:d9:e0:fc:4b:7b
Signature Algorithm: sha512WithRSAEncryption
Issuer: C=CN, ST=Beijing, L=Beijing, O=Chinese FreeBSD Community (CFC), OU=Systems Administrator, CN=bsdcn.org, emailAddress=bsdcn.org
Validity
Not Before: Apr 16 03:53:49 2026 GMT
Not After : Apr 16 03:53:49 2027 GMT
Subject: C=CN, ST=Beijing, L=Beijing, O=Chinese FreeBSD Community (CFC), OU=Systems Administrator, CN=bsdcn.org, emailAddress=bsdcn.org

……省略部分输出……

证书私钥 cert.key 位于 etc/ssl 目录:

-rw-------  1 root wheel 1886 Apr 16 11:53 /etc/ssl/cert.key

验证私钥:

$ openssl x509 -noout -modulus -in /etc/ssl/certs/cert.crt | openssl sha256
SHA2-256(stdin)= b0b6e2fc57193c09f89ce9d3d9712351cf3368cf262ae209e63f3b8f012893f8

$ openssl rsa -noout -modulus -in /etc/ssl/cert.key | openssl sha256
Enter pass phrase for /etc/ssl/cert.key: # 输入之前设置的密码
SHA2-256(stdin)= b0b6e2fc57193c09f89ce9d3d9712351cf3368cf262ae209e63f3b8f012893f8
如果 SHA-256 值相同,则说明私钥与证书匹配

建议将上诉文件存放于 etc/ssl 目录,使用 chmod 命令将权限设为 0700 仅 root 可读

$ cp /etc/ssl/certs/cert.crt /etc/ssl/
$ chmod 0700 /etc/ssl/cert.crt
$ chmod 0700 /etc/ssl/cert.key

配置 FIPS 提供者

OpenSSL 3 自 FreeBSD 14 起纳入基本系统,随之而来的还有全新的 提供者模块 provider module 概念

除内置默认提供者外,legacy 模块负责实现现已可选、已弃用的加密算法

fips 模块则严格限定于 FIPS 标准允许的密码算法集

OpenSSL 的 FIPS 相关部分受到重点关注,附有已知安全问题列表,并定期接受 FIPS 140 验证流程审查

这些措施使用户得以确保满足 FIPS 合规要求

fips_module 还受额外安全机制保护,未通过完整性检查则无法使用。本地系统管理员可按需配置此检查,继而允许每个 OpenSSL 3 用户加载该模块。如果配置不当,FIPS 模块报错如下:

$ echo test | openssl aes-128-cbc -a -provider fips -pbkdf2

输出应类似于以下内容:

aes-128-cbc: unable to load provider fips
Hint: use -provider-path option or OPENSSL_MODULES environment variable.
1090A56510220000:error:12800067:DSO support routines:dlfcn_load:could not load the sharedlibrary:/usr/src/crypto/openssl/crypto/dso/dso_dlfcn.c:115:filename(/usr/lib/ossl-modules/fips.so): Cannot open "/usr/lib/ossl-modules/fips.so"
1090A56510220000:error:12800067:DSO support routines:DSO_load:could not load the shared library:/usr/src/crypto/openssl/crypto/dso/dso_lib.c:147:
1090A56510220000:error:07880025:common libcrypto routines:provider_init:reason(37):/usr/src/crypto/openssl/crypto/provider_core.c:1026:name=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 辅助此过程。用法如下:

$ cp /usr/local/lib/ossl-modules/fips.so /usr/lib/ossl-modules/
$ openssl fipsinstall -module /usr/lib/ossl-modules/fips.so -out /etc/ssl/fipsmodule.cnf

输出应类似于以下内容(版本号取决于 Ports 中安装的 OpenSSL 版本):

	name:     	OpenSSL FIPS Provider
	version:  	3.0.20
	build:    	3.0.20
INSTALL PASSED

接下来应修改 /etc/ssl/openssl.cnf ,加入以下三项配置:

  • 引入上面生成的 /etc/ssl/fipsmodule.cnf 文件
  • 导出 FIPS 模块以供调用
  • 显式 激活默认模块
……省略其他内容……

# For FIPS
# Optionally include a file that is generated by the OpenSSL fipsinstall
# application. This file contains configuration data required by the OpenSSL
# fips provider. It contains a named section e.g. [fips_sect] which is
# referenced from the [provider_sect] below.
# Refer to the OpenSSL security policy for more information.
.include /etc/ssl/fipsmodule.cnf

……省略其他内容……

# List of providers to load
[provider_sect]
default = default_sect
# The fips section name should match the section name inside the
# included fipsmodule.cnf.
fips = fips_sect

# If no providers are activated explicitly, the default one is activated implicitly.
# See man 7 OSSL_PROVIDER-default for more details.
#
# If you add a section explicitly activating any other provider(s), you most
# probably need to explicitly activate the default provider, otherwise it
# becomes unavailable in openssl.  As a consequence applications depending on
# OpenSSL may not work correctly which could lead to significant system
# problems including inability to remotely access the system.
[default_sect]
activate = 1

以上步骤完成后,即可确认 FIPS 模块确实可用且正常工作:

$ echo test | openssl aes-128-cbc -a -provider fips -pbkdf2

输出应类似于以下内容:

enter AES-128-CBC encryption password: # 输入密码
Verifying - enter AES-128-CBC encryption password: # 重复输入密码
U2FsdGVkX1+cIAxHqRAhBgFQdCjTDU2sGevQ152Gw74=

查看当前 OpenSSL 提供者状态:

# openssl list -providers
Providers:
default
name: OpenSSL Default Provider
version: 3.5.6
status: active
fips
name: OpenSSL FIPS Provider
version: 3.0.20
status: active
以上输出中,default 提供者的版本号取决于系统使用的 OpenSSL 版本(基本系统或 Ports)

FIPS 提供者的版本号取决于 Ports 中安装的 OpenSSL 版本

FIPS 模块发生变动时(如系统更新后,或基本系统 OpenSSL 应用安全修复后),均需要重复上述过程

Next:入侵检测系统 Previous: 安全审计 Home: 安全管理