PKI 公钥架构 – 基于 Dogtag 实践

01_cn_learningbook_pki_practice_cover

导航

本文通过开源软件 Dogtag 描述 PKI 的基础功能和安装实践,分为上下 2 篇:

  1. 上篇,原理篇,描述 PKI 的基础知识,点击链接即可访问:PKI 公钥系统 – 基于 Dogtag 描述
  2. 下篇,即本篇,描述如何使用 Dogtag 搭建 PKI 系统。

本文基于以下软件进行实践

序号 软件 版本 描述
01 Rocky Linux 9.6 操作系统
02 Dogtag 11.6.0 PKI 基础架构(idm-pki-ca)
03 Nginx 1.22.1 WEB 服务
04 Firefox 143.0.4 浏览器

术语

  1. PKI: Public Key Infrastructure, 即公钥基础架构。
  2. CA: Certificate Authority, 即证书中心。

前言

Dogtag 是 RHCS(Red Hat Certificate System) 的开源版本,用于构建和管理数字证书相关的服务。
本文主要描述如何搭建一个企业内部使用的 PKI 系统,用于终端设备的证书服务:

  1. 创建一个 2 层的 CA 架构并将 rootCA 的公钥证书在企业内分发
  2. 创建 2 个 CA, 即 rootCA(根)和 subCA01(子 CA)
  3. 通过 subCA01 给 Nginx 服务器签发证书
  4. PC 访问 Nginx 服务器时没有 https 告警

02_cn_learningbook_pki_practice_top

 

设备清单

序号 主机名 IP 角色
01 rootca.thelearningbook.online 192.168.1.110 根 CA
02 subca01.thelearningbook.online 192.168.1.111 中间层 CA
03 www.thelearningbook.online 192.168.1.112 Nginx 服务器
04 pc.thelearningbook.online 192.168.1.113 客户端 PC

DNS

本文使用的域名是 thelearningbook.online, 使用内部 Bind 作为 DNS 服务器进行解析。新增 DNS 条目,以确保:

  1. 服务器之间能够通过主机名互相访问
  2. 用户端电脑可以通过域名访问 nginx 服务器

04_cn_learningbook_pki_practice_dns

服务器基础配置

所有服务器最小化安装,启用 SElinux 和防火墙功能。


# cat /etc/selinux/config | grep SELINUX
SELINUX=permissive
SELINUXTYPE=targeted

# systemctl status firealld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; preset: enabled)
Active: active (running) since Thu 2025-10-16 19:46:01 CST; 4min 26s ago

Root CA 安装配置

Root CA 作为 CA 的顶层,负责给中间层 CA 签发证书,同时它的公钥证书将发布到整个企业中。
05_cn_learningbook_pki_practice_rootca

Root CA 目录服务的安装

Dogtag 使用 ds389 作为后端数据库,用于存储 CA 的证书元数据、用户身份数据、配置参数等,直接使用 dnf 命令即可安装,同时在安装完成后生成模板文件 ds-root.inf.


# dnf install -y 389-ds-base
# cd /root
# mkdir conf && cd conf                   // 创建配置目录,即 /root/conf
# dscreate create-template ds-root.inf    // 生成一个目录服务的模板文件

配置 ds-root.inf 文件,根据自己的环境定制相关的配置信息:

  1. instance_name – 目录服务的实例名,由于是 Root CA, 所以我们使用的名称是 rootca.
  2. root_password – 目录服务 root 用户的密码,非操作系统用户 root 密码,这里使用的密码是 rootCA@123
  3. suffix – 定义目录服务的后缀,直接套用自己的域名即可,比如本站的域名 thelearningbook.online.
  4. self_sign_cert – 是否创建自签名证书,这里选择不创建。

# sed -i \
-e "s/;instance_name = .*/instance_name = rootca/g" \
-e "s/;root_password = .*/root_password = rootCA@123/g" \
-e "s/;suffix = .*/suffix = dc=thelearningbook,dc=online/g" \
-e "s/;create_suffix_entry = .*/create_suffix_entry = True/g" \
-e "s/;self_sign_cert = .*/self_sign_cert = False/g" \
ds-root.inf

根据配置文件的信息安装目录服务:


# dscreate from-file ds-root.inf

安装完成后 ds389 将自动启动并加入启动项,可以通过查看 389 端口号是否启用来确定安装是否成功:


# ss -ltan | grep 389
LISTEN     0         128         *:389         *:*

创建一个目录管理员来管理 CA 内的证书信息,管理员密码设置为 rootCA@123


# ldapadd -H ldap://localhost -x -D "cn=Directory Manager" -w rootCA@123 << EOF
dn: dc=pki,dc=thelearningbook,dc=online
objectClass: domain
dc: pki
EOF

Root CA 的安装


# dnf install -y pki-ca

安装完成以后可以从官方网站(地址)下载一个模板配置文件,然后根据自己的环境进行定制,以下是本文使用的配置信息:

  1. 证书相关名称和服务端口号全部保持不变
  2. 密码全部改为 rootCA@123
  3. 域名改为 thelearningbook.online

# vi rootca.cfg
[DEFAULT]

pki_instance_name=pki-tomcat
pki_https_port=8443
pki_http_port=8080
pki_server_database_password=rootCA@123

[Tomcat]
pki_ajp_port=8009
pki_tomcat_server_port=8005

[CA]
pki_admin_email=caadmin@thelearningbook.online
pki_admin_name=caadmin
pki_admin_nickname=caadmin
pki_admin_password=rootCA@123
pki_admin_uid=caadmin

pki_client_pkcs12_password=rootCA@123

pki_ds_url=ldap://rootca.thelearningbook.online:389
pki_ds_base_dn=dc=ca,dc=pki,dc=thelearningbook,dc=online
pki_ds_database=ca
pki_ds_password=rootCA@123

pki_security_domain_name=thelearningbook.online

pki_ca_signing_nickname=ca_signing
pki_ocsp_signing_nickname=ca_ocsp_signing
pki_audit_signing_nickname=ca_audit_signing
pki_sslserver_nickname=sslserver
pki_subsystem_nickname=subsystem

根据配置文件来创建根 CA:


# pkispawn -f rootca.cfg -s CA

安装成功后,系统将输出以下内容:


==========================================================================
INSTALLATION SUMMARY
==========================================================================

Administrator's username: caadmin
Administrator's PKCS #12 file:
/root/.dogtag/pki-tomcat/ca_admin_cert.p12

To check the status of the subsystem:
systemctl status pki-tomcatd@pki-tomcat.service

To restart the subsystem:
systemctl restart pki-tomcatd@pki-tomcat.service

The URL for the subsystem is:
https://rootca.thelearningbook.online:8443/ca

PKI instances will be enabled upon system boot

==========================================================================

以上输出的说明如下:

  1. 提示管理员的证书保存在目录 /root/.dogtag/pki-tomcat,如果需要在网页上进行证书的管理工作,需要将管理员证书导入到浏览器中。
  2. 提示如何查看 Dogtag 的运行状态,如何重启 Dogtag.
  3. 提示证书的管理地址,你可以访问这些地址对证书进行管理。

安装完成后,CA 的证书相关信息保存在 NSS database 中,使用以下命令查看:


# certutil -L -d /var/lib/pki/pki-tomcat/conf/alias
Certificate Nickname                        Trust Attributes
                                            SSL,S/MIME,JAR/XPI

ca_signing                                  CTu,Cu,Cu
ca_ocsp_signing                             u,u,u
sslserver                                   u,u,u
subsystem                                   u,u,u
ca_audit_signing                            u,u,Pu

同时在安装完成后,Dogtag 将自动启动,检查相关端口是否正常监听:


# ss -ltan | egrep "8443|8080|8005"
LISTEN 0      100                         *:8443                       *:*
LISTEN 0      1          [::ffff:127.0.0.1]:8005                       *:*
LISTEN 0      100                         *:8080                       *:*

添加防火墙规则:


# firewall-cmd --permanent --add-port=8443/tcp
# firewall-cmd --permanent --add-port=8080/tcp
# firewall-cmd --permanent --add-port=8005/tcp
# firewall-cmd --reload

浏览器信任配置

此时,打开 Firefox 浏览器访问 CA 的管理地址:
https://rootca.thelearningbook.online:8443/ca

浏览器会发出告警,提示这是一个不安全的站点,如下:

07_cn_learningbook_pki_practice_firefox-with-warning

为了消除这种告警信息,需要将 rootCA 的证书导入到浏览器的信任仓库中。
首先在 rootCA 上导出 CA 证书:


# pki-server cert-export ca_signing --cert-file ca_signing.crt

然后将证书 ca_signing.crt 拷贝到电脑上,打开 FireFox 的配置菜单,将证书导入到浏览器中。
Firefox –> 设置 –> 隐私和安全 –> 证书
08_cn_learningbook_pki_practice_firefox-import-cert

在”证书颁发机构” 中导入 CA 证书
09_cn_learningbook_pki_practice_firefox-import-cert

信任此证书
10_cn_learningbook_pki_practice_firefox-import-cert

新证书入住成功
11_cn_learningbook_pki_practice_firefox-import-cert

再次刷新 FireFox 后,浏览器将不再告警。
12_cn_learningbook_pki_practice_firefox-import-cert

证书管理员

Dogtag 支持使用 Web 进行证书管理工作,比如查看和签发证书等,如果需要使用此功能,必须先将管理员的证书导入到 CA 和浏览器内。

在没有导入管理员证书之前,当我们查看证书时,Dogtag 会提示安装管理员证书:
13_cn_learningbook_pki_practice_firefox-import-AdminCert

提示如下:
14_cn_learningbook_pki_practice_firefox-import-AdminCert

管理员证书导入流程

首先将刚才导出的 root CA 的证书导入到 client NSS database


# pki nss-cert-import --cert ca_signing.crt --trust CT,C,C ca_signing

再将管理员证书导入到 client NSS database


# pki pkcs12-import \
--pkcs12 ~/.dogtag/pki-tomcat/ca_admin_cert.p12 \
--password rootCA@123

检查管理员状态


# pki -n caadmin ca-user-show caadmin
--------------
User "caadmin"
--------------
User ID: caadmin
Full name: caadmin
Email: caadmin@thelearningbook.online
Type: adminType
State: 1

最后将 root CA 的管理员证书拷贝到电脑上,再导入到 Firefox 浏览器内


# cp /root/.dogtag/pki-tomcat/ca_admin_cert.p12 /root/conf
# copy ca_admin_cert.p12 to PC

再次打开证书管理器
15_cn_learningbook_pki_practice_firefox-import-AdminCert

选择管理员证书
16_cn_learningbook_pki_practice_firefox-import-AdminCert

输入管理员密码
17_cn_learningbook_pki_practice_firefox-import-AdminCert

管理员证书入住成功
18_cn_learningbook_pki_practice_firefox-import-AdminCert

再次刷新
19_cn_learningbook_pki_practice_firefox-import-AdminCert

全部导入完成后,刷新 Firefox 再次查看证书,将显示当前正在使用的证书。
20_cn_learningbook_pki_practice_firefox-import-AdminCert
21_cn_learningbook_pki_practice_firefox-import-AdminCert
22_cn_learningbook_pki_practice_firefox-import-AdminCert

至此,一个功能完整的 CA 安装完成,你现在就可以使用它签发证书,响应 OCSP 查询等。

完成 root CA 的安装配置即可得到一个正常使用的 CA, 如果用户不需要中间层 CA 可以直接跳过下一章节,直接进入签发证书章节。

Subordinate CA 安装配置

在本文中,Subordinae 即是中间层 CA 也是底层 CA,当它被创建后,将接管所有终端设备的证书管理工作,而 Root CA 将只负责对中间层 CA 签发证书。
06_cn_learningbook_pki_practice_subca01

和 Root CA 的安装一致,Dogtag 的安装分为 2 部分:

Subordinate CA 目录服务的安装


# dnf install -y 389-ds-base
# cd /root
# mkdir conf && cd conf
# dscreate create-template ds-subca01.inf

编辑 ds.inf 文件,根据自己的环境定制相关的配置信息

  1. instance_name 目录服务使用的实例名称,由于是 subordinate CA, 所以我们使用的名称是 subca01.
  2. root_password 目录服务 root 用户的密码,非操作系统用户 root 密码,这里使用的密码是 subCA@123
  3. suffix 定义目录服务的后缀,直接套用域名即可,比如本站的域名 thelearningbook.online
  4. self_sign_cert 是否创建自签名证书,这里选择不创建。

# sed -i \
-e "s/;instance_name = .*/instance_name = subca01/g" \
-e "s/;root_password = .*/root_password = subCA@123/g" \
-e "s/;suffix = .*/suffix = dc=thelearningbook,dc=online/g" \
-e "s/;create_suffix_entry = .*/create_suffix_entry = True/g" \
-e "s/;self_sign_cert = .*/self_sign_cert = False/g" \
ds-subca01.inf

ds389 将根据配置文件的内容来安装目录服务


# dscreate from-file ds-subca01.inf

安装完成后 ds389 将自动启动,可以通过查看 389 端口号是否启用来确定安装是否成功。


# ss -ltan | grep 389
LISTEN     0     128     *:389     *:*

创建一个目录管理员来管理 CA 内的证书元信息,密码是 subCA@123


# ldapadd -H ldap://localhost -x -D "cn=Directory Manager" -w subCA@123 << EOF
dn: dc=pki,dc=thelearningbook,dc=online
objectClass: domain
dc: pki
EOF

Subordinate CA 的安装

子 CA 的安装需要根 CA 的证书,安装之前先将根 CA 的证书拷贝到本机,并重命名为 root-ca_signing.crt.


# cd /root/conf
# scp rootca:/root/conf/ca_signing.crt root-ca_signing.crt

安装 Dogtag


# dnf install -y pki-ca

安装完成以后可以从官方网站(地址)下载一个子 CA 的模板文件,然后根据当前的环境定制相关的配置,以下是本文使用的配置信息。

  1. 端口号全部保持不变
  2. 子 CA 管理员名称变更为 subca01Admin, 密码全部变更为 subCA@123
  3. 域名是 thelearningbook.online
  4. 注意 pki_security_domain 的配置需要更改为根 CA 的主机名和密码

# cd /root/conf
# vi subca01.cfg
[DEFAULT]
pki_instance_name=pki-tomcat
pki_https_port=8443
pki_http_port=8080
pki_server_database_password=subCA@123
pki_cert_chain_path=root-ca_signing.crt

[Tomcat]
pki_ajp_port=8009
pki_tomcat_server_port=8005

[CA]
pki_admin_email=subca01Admin@thelearningbook.online
pki_admin_name=subca01Admin
pki_admin_nickname=subca01Admin
pki_admin_password=subCA@123
pki_admin_uid=subca01Admin

pki_client_pkcs12_password=subCA@123

pki_ds_url=ldap://subca01.thelearningbook.online:389
pki_ds_base_dn=dc=ca,dc=pki,dc=thelearningbook,dc=online
pki_ds_database=ca
pki_ds_password=subCA@123

pki_security_domain_hostname=rootca.thelearningbook.online
pki_security_domain_user=caadmin
pki_security_domain_password=rootCA@123

pki_subordinate=True

pki_issuing_ca_hostname=rootca.thelearningbook.online

pki_ca_signing_nickname=ca_signing
pki_ca_signing_subject_dn=cn=Subordinate CA Signing Certificate,o=thelearningbook

pki_ocsp_signing_nickname=ca_ocsp_signing
pki_audit_signing_nickname=ca_audit_signing
pki_sslserver_nickname=sslserver
pki_subsystem_nickname=subsystem

创建子 CA


# pkispawn -f subca01.cfg -s CA

安装成功后,系统将输出以下内容:


==========================================================================
INSTALLATION SUMMARY
==========================================================================

Administrator's username: subca01Admin
Administrator's PKCS #12 file:
/root/.dogtag/pki-tomcat/ca_admin_cert.p12

To check the status of the subsystem:
systemctl status pki-tomcatd@pki-tomcat.service

To restart the subsystem:
systemctl restart pki-tomcatd@pki-tomcat.service

The URL for the subsystem is:
https://subca01.thelearningbook.online:8443/ca

PKI instances will be enabled upon system boot

==========================================================================

同时在安装完成后,Dogtag 将自动启动,检查相关端口是否正常启用并添加防火墙规则。


# ss -ltan | egrep "8443|8080|8005"
LISTEN     0 100                *:8443          *:*
LISTEN     0 100                *:8080          *:*
LISTEN     0 1 [::ffff:127.0.0.1]:8005          *:*

添加防火墙规则


# firewall-cmd --permanent --add-port=8443/tcp
# firewall-cmd --permanent --add-port=8080/tcp
# firewall-cmd --permanent --add-port=8005/tcp
# firewall-cmd --reload

信任配置

此时,打开 Firefox 浏览器访问子 CA 的管理地址:
https://subca01.thelearningbook.online:8443/ca

浏览器不会发出告警信息,因为我们之前已经导入了 Root CA 的证书,浏览器可以自动验证子 CA 的地址,如下:
25_cn_learningbook_pki_practice_firefox-import-subca01AdminCert
26_cn_learningbook_pki_practice_firefox-import-subca01AdminCert

子 CA 的管理员证书导入

subca01 的管理员导入方法和 rootca 的导入方法是一样的,子 CA 安装完成后,以下 NSS database 将被自动创建:

  1. server NSS database: /var/lib/pki/pki-tomcat/conf/alias
  2. admin NSS database: ~/.dogtag/pki-tomcat/ca/alias

检查 server NSS database 中的证书:


# certutil -L -d /var/lib/pki/pki-tomcat/conf/alias
Certificate Nickname            Trust Attributes
                                SSL,S/MIME,JAR/XPI

caSigningCert External CA       CT,C,C
ca_signing                      CTu,Cu,Cu
ca_ocsp_signing                 u,u,u
sslserver                       u,u,u
subsystem                       u,u,u
ca_audit_signing                u,u,Pu

首先将 Root CA 的证书导入


# pki nss-cert-import --cert root-ca_signing.crt --trust CT,C,C ca_signing

再导入管理员证书


# pki pkcs12-import --pkcs12 /root/.dogtag/pki-tomcat/ca_admin_cert.p12 --password subCA@123

检查管理员是否正常导入


# pki -n subca01Admin ca-user-show subca01Admin
-------------------
User "subca01Admin"
-------------------
User ID: subca01Admin
Full name: subca01Admin
Email: subca01Admin@thelearningbook.online
Type: adminType
State: 1

最后将 sub CA 的管理员证书拷贝到电脑上,准备导入到 Firefox 浏览器内。


# cp /root/.dogtag/pki-tomcat/ca_admin_cert.p12 /root/conf/subca01_admin_cert.p12
# copy subca01_admin_cert.p12 to PC

注意:在 Dogtag 中,由于 rootca 和 subca01 的管理员都叫 PKI Adinistrator, 所以为了避免混淆,在导入 subca01 的管理员证书之前我们先把 root CA 的管理员证书删除,仅保留根 CA 的公钥证书即可。
删除 rootca 的管理员证书
27_cn_learningbook_pki_practice_firefox-import-subca01AdminCert

开始导入 subca01 的管理员证书
28_cn_learningbook_pki_practice_firefox-import-subca01AdminCert

选择 subca01 的管理员证书
29_cn_learningbook_pki_practice_firefox-import-subca01AdminCert

输入 subca01 的管理员证书的密码
30_cn_learningbook_pki_practice_firefox-import-subca01AdminCert

完成 subca01 的管理员证书
31_cn_learningbook_pki_practice_firefox-import-subca01AdminCert

访问管理页面,正常显示所有菜单
32_cn_learningbook_pki_practice_firefox-import-subca01AdminCert

签发证书

以 Nginx 服务器为例,我们通过浏览器的管理方式来签发一张 Web 证书,以启用可信任的 https 通讯。

安装 Nginx


# dnf install -y nginx

生成 CSR

在 Nginx 服务器上使用 openssl 工具生成证书请求(CSR)


# mkdir /root/cert && cd cert
# openssl req -new -newkey rsa:4096 \
-nodes \
-out "www.thelearningbook.online.csr" \
-keyout "www.thelearningbook.online.key" \
-subj "/CN=www.thelearningbook.online/DC=thelearningbook/DC=online"

拷贝 csr 的内容


# cat cat www.thelearningbook.online.csr

打开浏览器 https://subca01.thelearningbook.online:8443/ca
依次访问:SSL End Users Services –> Manual Server Certificate Enrollment
35_cn_learningbook_pki_practice_create-nginx-cert

选择 Manual Server Certificate Enrollment
36_cn_learningbook_pki_practice_create-nginx-cert

将 CSR 的内容粘贴并填写相关信息
37_cn_learningbook_pki_practice_create-nginx-cert

提交后可以直接点击 request ID 查看请示的状态
38_cn_learningbook_pki_practice_create-nginx-cert

当前 request 的状态处于 pending
39_cn_learningbook_pki_practice_create-nginx-cert

查看当前的所有请求
40_cn_learningbook_pki_practice_create-nginx-cert

点击请求,进入签发证书的流程。
41_cn_learningbook_pki_practice_create-nginx-cert

新窗口中列出了当前请求的详细信息,确认后拉到网页的底部,点击提交。
42_cn_learningbook_pki_practice_create-nginx-cert

成功完成申请后,网页提示新证书的相关信息,网页底部 Certificate Base-64 Encoded 的内容就是证书,将证书内容复制。
43_cn_learningbook_pki_practice_create-nginx-cert

你也可以在 List Certificat 中找到新证书
44_cn_learningbook_pki_practice_create-nginx-cert

Nginx 配置证书

首先创建证书文件,将上面复制的证书内容粘贴到文件中。


# cd /root/cert
# vi www.thelearningbook.online.crt
-----BEGIN CERTIFICATE-----
MIIFezCCA+OgAwIBAgIRAJXiErxgsRMt//aEdvD7ckowDQYJKoZIhvcNAQELBQAwRzEYMBYGA1UE
CgwPdGhlbGVhcm5pbmdib29rMSswKQYDVQQDDCJTdWJvcmRpbmF0ZSBDQSBTaWduaW5nIENlcnRp
......
xOLgnAGCl4q9PxgsyL3lBFO1HAh1LJihsgpc1P7souSDx4wJ5otJX6e5iSzFqp9WIyd5ZMvKrWPe
h6lUM4XTnYwpGIPKZO3r04AfXrE46lieAmHfh1UlATeHLqn5HkIQ
-----END CERTIFICATE-----

然后登陆 subca01 导出子 CA 的证书,并将证书拷贝到 Nginx 服务器。


# cd /root/conf
# pki-server cert-export ca_signing --cert-file sub01-ca_signing.crt
# scp sub01-ca_signing.crt www.thelearningbook.online:/root/cert/

把子 CA 证书的内容添加到证书中,生成全链证书


# cat sub01-ca_signing.crt >> www.thelearningbook.online.crt

将证书和私钥拷贝到 /etc/pki/nginx


# mkdir -p /etc/pki/nginx/private
# cp www.thelearningbook.online.crt /etc/pki/nginx/
# cp www.thelearningbook.online.key /etc/pki/nginx/private

配置 /etc/nginx/nginx.conf 文件,启用 HTTPS 功能。
47_cn_learningbook_pki_practice_create-nginx-cert

启动 Nginx


# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

# systemctl start nginx
# systemctl enable nginx

测试
48_cn_learningbook_pki_practice_create-nginx-cert

本文完