导航
本文通过开源软件 Dogtag 描述 PKI 的基础功能和安装实践,分为上下 2 篇:
- 上篇,原理篇,描述 PKI 的基础知识,点击链接即可访问:PKI 公钥系统 – 基于 Dogtag 描述
 - 下篇,即本篇,描述如何使用 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 | 浏览器 | 
术语
- PKI: Public Key Infrastructure, 即公钥基础架构。
 - CA: Certificate Authority, 即证书中心。
 
前言
Dogtag 是 RHCS(Red Hat Certificate System) 的开源版本,用于构建和管理数字证书相关的服务。
本文主要描述如何搭建一个企业内部使用的 PKI 系统,用于终端设备的证书服务:
- 创建一个 2 层的 CA 架构并将 rootCA 的公钥证书在企业内分发
 - 创建 2 个 CA, 即 rootCA(根)和 subCA01(子 CA)
 - 通过 subCA01 给 Nginx 服务器签发证书
 - PC 访问 Nginx 服务器时没有 https 告警
 
设备清单
| 序号 | 主机名 | 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 条目,以确保:
- 服务器之间能够通过主机名互相访问
 - 用户端电脑可以通过域名访问 nginx 服务器
 

服务器基础配置
所有服务器最小化安装,启用 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 签发证书,同时它的公钥证书将发布到整个企业中。
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 文件,根据自己的环境定制相关的配置信息:
- instance_name – 目录服务的实例名,由于是 Root CA, 所以我们使用的名称是 rootca.
 - root_password – 目录服务 root 用户的密码,非操作系统用户 root 密码,这里使用的密码是 rootCA@123
 - suffix – 定义目录服务的后缀,直接套用自己的域名即可,比如本站的域名 thelearningbook.online.
 - 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
安装完成以后可以从官方网站(地址)下载一个模板配置文件,然后根据自己的环境进行定制,以下是本文使用的配置信息:
- 证书相关名称和服务端口号全部保持不变
 - 密码全部改为 rootCA@123
 - 域名改为 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
==========================================================================
以上输出的说明如下:
- 提示管理员的证书保存在目录 /root/.dogtag/pki-tomcat,如果需要在网页上进行证书的管理工作,需要将管理员证书导入到浏览器中。
 - 提示如何查看 Dogtag 的运行状态,如何重启 Dogtag.
 - 提示证书的管理地址,你可以访问这些地址对证书进行管理。
 
安装完成后,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
浏览器会发出告警,提示这是一个不安全的站点,如下:

为了消除这种告警信息,需要将 rootCA 的证书导入到浏览器的信任仓库中。
首先在 rootCA 上导出 CA 证书:
# pki-server cert-export ca_signing --cert-file ca_signing.crt
然后将证书 ca_signing.crt 拷贝到电脑上,打开 FireFox 的配置菜单,将证书导入到浏览器中。
Firefox –> 设置 –> 隐私和安全 –> 证书

在”证书颁发机构” 中导入 CA 证书

信任此证书

新证书入住成功

再次刷新 FireFox 后,浏览器将不再告警。

证书管理员
Dogtag 支持使用 Web 进行证书管理工作,比如查看和签发证书等,如果需要使用此功能,必须先将管理员的证书导入到 CA 和浏览器内。
在没有导入管理员证书之前,当我们查看证书时,Dogtag 会提示安装管理员证书:

提示如下:

管理员证书导入流程
首先将刚才导出的 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
再次打开证书管理器

选择管理员证书

输入管理员密码

管理员证书入住成功

再次刷新

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



至此,一个功能完整的 CA 安装完成,你现在就可以使用它签发证书,响应 OCSP 查询等。
完成 root CA 的安装配置即可得到一个正常使用的 CA, 如果用户不需要中间层 CA 可以直接跳过下一章节,直接进入签发证书章节。
Subordinate CA 安装配置
在本文中,Subordinae 即是中间层 CA 也是底层 CA,当它被创建后,将接管所有终端设备的证书管理工作,而 Root CA 将只负责对中间层 CA 签发证书。
和 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 文件,根据自己的环境定制相关的配置信息
- instance_name 目录服务使用的实例名称,由于是 subordinate CA, 所以我们使用的名称是 subca01.
 - root_password 目录服务 root 用户的密码,非操作系统用户 root 密码,这里使用的密码是 subCA@123
 - suffix 定义目录服务的后缀,直接套用域名即可,比如本站的域名 thelearningbook.online
 - 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 的模板文件,然后根据当前的环境定制相关的配置,以下是本文使用的配置信息。
- 端口号全部保持不变
 - 子 CA 管理员名称变更为 subca01Admin, 密码全部变更为 subCA@123
 - 域名是 thelearningbook.online
 - 注意 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 的地址,如下:


子 CA 的管理员证书导入
subca01 的管理员导入方法和 rootca 的导入方法是一样的,子 CA 安装完成后,以下 NSS database 将被自动创建:
- server NSS database: /var/lib/pki/pki-tomcat/conf/alias
 - 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 的管理员证书

开始导入 subca01 的管理员证书

选择 subca01 的管理员证书

输入 subca01 的管理员证书的密码

完成 subca01 的管理员证书

访问管理页面,正常显示所有菜单

签发证书
以 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

选择 Manual Server Certificate Enrollment

将 CSR 的内容粘贴并填写相关信息

提交后可以直接点击 request ID 查看请示的状态

当前 request 的状态处于 pending

查看当前的所有请求

点击请求,进入签发证书的流程。

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

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

你也可以在 List Certificat 中找到新证书

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 功能。

启动 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
测试

本文完