第 21 章 从 CA 请求证书并使用 RHEL 系统角色创建自签名证书
许多服务(如 Web 服务器)都使用 TLS 加密与客户端的连接。这些服务需要私钥和证书,以及为证书签名的可信证书颁发机构(CA)。
通过使用 certificate
RHEL 系统角色,您可以在受管节点上自动生成私钥。另外,该角色将 certmonger
服务配置为向 CA 发送证书签名请求(CSR),服务会在证书过期前自动更新证书。
出于测试目的,您可以使用 certificate
角色创建自签名证书,而不是从 CA 请求签名证书。
21.1. 使用 certificate
RHEL 系统角色从 IdM CA 请求一个新证书
如果 Red Hat Enterprise Linux 主机是 RHEL 身份管理(IdM)环境的成员,您可以从 IdM 证书颁发机构(CA)请求 TLS 证书,并在此主机上运行的服务中使用它们。通过使用 证书
RHEL 系统角色,您可以自动创建私钥的过程,并让 certmonger
服务从 CA 请求证书。默认情况下,certmonger
会在证书过期前更新证书。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有
sudo
权限。 - 受管节点是 IdM 域的成员,域使用 IdM 集成的 CA。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Create certificates hosts: managed-node-01.example.com tasks: - name: Create a self-signed certificate ansible.builtin.include_role: name: rhel-system-roles.certificate vars: certificate_requests: - name: web-server ca: ipa dns: www.example.com principal: HTTP/www.example.com@EXAMPLE.COM run_before: systemctl stop httpd.service run_after: systemctl start httpd.service
示例 playbook 中指定的设置包括以下内容:
name: <path_or_file_name>
定义生成的私钥和证书文件的名称或路径:
-
如果将变量设置为
web-server
,该角色会将私钥存储在/etc/pki/tls/private/web-server.key
中,并将证书存储在/etc/pki/tls/certs/web-server.crt
文件中。 如果将变量设置为路径,如
/tmp/web-server
,该角色会将私钥存储在/tmp/web-server.key
中,并将证书存储在/tmp/web-server.crt
文件中。请注意,您使用的目录必须设置
cert_t
SELinux 上下文。您可以使用selinux
RHEL 系统角色来管理 SELinux 上下文。
-
如果将变量设置为
ca: ipa
- 定义该角色从 IdM CA 请求证书。
dns: <hostname_or_list_of_hostnames>
-
设置发布的证书中的 Subject Alternative Names (SAN)字段所包含的主机名。您可以使用通配符(
*
)或以 YAML 列表格式指定多个名称。 principal: <kerberos_principal>
- 可选:设置证书中包含的 Kerberos 主体。
run_before: <command>
-
可选:定义
certmonger
在从 CA 请求证书前应执行的命令。 run_after: < command>
-
可选:定义
certmonger
应该在从 CA 收到发布的证书后执行的命令。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.certificate/README.md
文件。验证 playbook 语法:
$ ansible-playbook --syntax-check ~/playbook.yml
请注意,这个命令只验证语法,不会防止错误但有效的配置。
运行 playbook:
$ ansible-playbook ~/playbook.yml
验证
列出
certmonger
服务管理的证书:# ansible managed-node-01.example.com -m command -a 'getcert list' ... Number of certificates and requests being tracked: 1. Request ID '20240918142211': status: MONITORING stuck: no key pair storage: type=FILE,location='/etc/pki/tls/private/web-server.key' certificate: type=FILE,location='/etc/pki/tls/certs/web-server.crt' CA: IPA issuer: CN=Certificate Authority,O=EXAMPLE.COM subject: CN=www.example.com issued: 2024-09-18 16:22:11 CEST expires: 2025-09-18 16:22:10 CEST dns: www.example.com key usage: digitalSignature,keyEncipherment eku: id-kp-serverAuth,id-kp-clientAuth pre-save command: systemctl stop httpd.service post-save command: systemctl start httpd.service track: yes auto-renew: yes
其他资源
-
/usr/share/ansible/roles/rhel-system-roles.certificate/README.md
文件 -
/usr/share/doc/rhel-system-roles/certificate/
目录