第 22 章 从过期的系统证书中恢复
如果身份管理(IdM)证书过期了,核心服务(如 Web UI、LDAP 和证书颁发)失败。ipa-certupdate
和 ipa-cacert-manage
等命令无法正常工作,因为系统无法建立安全连接。以下章节提供了几个关键故障场景的流程。
在进行任何更改之前,请创建 IdM 服务器的完整备份。至少,在每台服务器上创建一个关键数据的文件级备份:
# tar czvf /root/pki-backup_$(hostname -f)_$(date +%F).tar.gz /etc/dirsrv/slapd-* /etc/pki/pki-tomcat/ /var/lib/ipa/ /var/kerberos/krb5kdc/
在没有可靠备份的情况下不要继续。
使用 ipa-cert-fix
命令要非常小心。ipa-cert-fix
是一个功能强大但具有侵入性的工具,专为特定的故障场景设计:续订服务器上过期的服务证书。
-
如果 CA 证书本身已过期,请不要运行
ipa-cert-fix
。 -
不要在副本服务器上运行
ipa-cert-fix
,除非续订服务器处于不可恢复状态。在这种情况下,创建一个支持问题单。 -
不要将
ipa-cert-fix
作为常规故障排除工具运行。
滥用此工具可能会使情况更糟。
22.1. 从副本上过期的服务证书中恢复 复制链接链接已复制到粘贴板!
在这种故障场景下,续订服务器是健康的,但一个或多个副本无法续订其证书,并且现在处于离线状态。目标是从服务器手动同步或重新发布必要的证书,以恢复副本。
此流程涵盖四个关键证书:RA Agent
证书、Subsystem
证书、Directory Server (LDAP)
证书和 PKI Tomcat (Web Server)
证书。
如果您不确定哪个服务器是续订服务器,请在任何一个 IdM 服务器上运行以下命令。命令输出是 CA 续订服务器的可分辨名称(DN):
ldapsearch -Y GSSAPI -b cn=masters,cn=ipa,cn=etc,dc=example,dc=com ipaConfigString=caRenewalMaster dn
# ldapsearch -Y GSSAPI -b cn=masters,cn=ipa,cn=etc,dc=example,dc=com ipaConfigString=caRenewalMaster dn
如果 Kerberos 不可用,请使用以下命令和目录管理器密码:
ldapsearch -x -D 'cn=Directory Manager' -W -b cn=masters,cn=ipa,cn=etc,dc=example,dc=com ipaConfigString=caRenewalMaster dn
# ldapsearch -x -D 'cn=Directory Manager' -W -b cn=masters,cn=ipa,cn=etc,dc=example,dc=com ipaConfigString=caRenewalMaster dn
流程
验证 IdM 服务是否正在运行:
ipactl status
# ipactl status
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选。如果任何服务都没有运行,请强制它们启动:
ipactl start -f
# ipactl start -f
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -f
或--force
标志绕过一些启动检查,这在服务因为过期的证书而无法进行通信时是必需的。比较续订服务器和故障副本之间的 RA Agent 和 Subsystem 证书。
在健康的续订服务器和故障副本上,检索 RA Agent 和 subsystem 证书的序列号,并验证它们是否一样。
RA Agent 证书及其相应的 LDAP 条目。序列号是分号分隔的
description
属性字符串中的第二个值,例如2;SERIAL;…
:openssl x509 -in /var/lib/ipa/ra-agent.pem -noout -serial ldapsearch -D "cn=directory manager" -W -b "uid=ipara,ou=people,o=ipaca" description
# openssl x509 -in /var/lib/ipa/ra-agent.pem -noout -serial # ldapsearch -D "cn=directory manager" -W -b "uid=ipara,ou=people,o=ipaca" description
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Subsystem 证书及其相应的 LDAP 条目。序列号是分号分隔的
description
属性字符串中的第二个值,例如2;SERIAL;…
:certutil -L -d /etc/pki/pki-tomcat/alias/ -n 'subsystemCert cert-pki-ca' | grep "Serial Number" ldapsearch -D "cn=directory manager" -W -b "uid=pkidbuser,ou=People,o=ipaca" description
# certutil -L -d /etc/pki/pki-tomcat/alias/ -n 'subsystemCert cert-pki-ca' | grep "Serial Number" # ldapsearch -D "cn=directory manager" -W -b "uid=pkidbuser,ou=People,o=ipaca" description
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果副本上的序列号与 CA 续订服务器上的序列号不匹配,请执行下一步来同步它们。
将健康的证书手动复制到副本。将
ra-agent.pem
和 subsystem 证书从续订服务器复制到故障副本。复制 RA agent 证书文件:
scp /var/lib/ipa/ra-agent.pem root@failed-replica.idm.example.com:/tmp/
# scp /var/lib/ipa/ra-agent.pem root@failed-replica.idm.example.com:/tmp/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 导出 subsystem 证书:
certutil -L -d /etc/pki/pki-tomcat/alias -n 'subsystemCert cert-pki-ca' -a > /tmp/subsystem.pem
# certutil -L -d /etc/pki/pki-tomcat/alias -n 'subsystemCert cert-pki-ca' -a > /tmp/subsystem.pem
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 复制 subsystem 证书:
scp /tmp/subsystem.pem root@failed-replica.idm.example.com:/tmp/
# scp /tmp/subsystem.pem root@failed-replica.idm.example.com:/tmp/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
在故障副本上,替换过期的 RA agent 证书。
将健康的证书复制到合适的地方:
cp /tmp/ra-agent.pem /var/lib/ipa/ra-agent.pem
# cp /tmp/ra-agent.pem /var/lib/ipa/ra-agent.pem
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 更新 LDAP 中相应的条目,以确保它包含正确的证书 blob 和序列号。此步骤需要目录管理器密码。
通过将新的 RA agent 证书转换为单行 blob ,来为 LDAP 准备新的 RA agent 证书,并将其存储在变量中:
RA_CERT_BLOB=$(sed -rn '/^-----BEGIN CERTIFICATE-----$/{:1;n;/^-----END CERTIFICATE-----$/b2;H;b1};:2;${x;s/\s//g;p}' /tmp/ra-agent.pem)
# RA_CERT_BLOB=$(sed -rn '/^-----BEGIN CERTIFICATE-----$/{:1;n;/^-----END CERTIFICATE-----$/b2;H;b1};:2;${x;s/\s//g;p}' /tmp/ra-agent.pem)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 从新证书中提取序列号,并将其存储在变量中:
RA_CERT_SERIAL=$(openssl x509 -in /tmp/ra-agent.pem -noout -serial | cut -d'=' -f2)
# RA_CERT_SERIAL=$(openssl x509 -in /tmp/ra-agent.pem -noout -serial | cut -d'=' -f2)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确保 IdM 服务在尝试修改 LDAP 数据库之前正在运行:
ipactl start -f
# ipactl start -f
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用新证书 blob 和序列号更新 RA agent 的 LDAP 条目。系统将提示您输入目录管理器密码:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
IDM.EXAMPLE.COM
替换为您的 IdM 域,或使用您的自定义证书主题库。
在故障副本上,替换过期的 subsystem 证书。
将健康的证书导入到 NSS 数据库中。这需要 NSS 数据库密码,该密码可在
/etc/pki/pki-tomcat/password.conf
中找到。为 NSS 数据库密码文件的位置设置一个变量,以便在以下命令中更轻松地使用:
PWDFILE=/etc/pki/pki-tomcat/alias/pwdfile.txt
# PWDFILE=/etc/pki/pki-tomcat/alias/pwdfile.txt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 从 NSS 数据库中删除旧、过期的 subsystem 证书:
certutil -D -d /etc/pki/pki-tomcat/alias -n 'subsystemCert cert-pki-ca' -f $PWDFILE
# certutil -D -d /etc/pki/pki-tomcat/alias -n 'subsystemCert cert-pki-ca' -f $PWDFILE
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
/tmp/subsystem.pem
文件中的新的、健康的 subsystem 证书添加到 NSS 数据库中:certutil -A -d /etc/pki/pki-tomcat/alias -n 'subsystemCert cert-pki-ca' -t ",," -i /tmp/subsystem.pem -f $PWDFILE
# certutil -A -d /etc/pki/pki-tomcat/alias -n 'subsystemCert cert-pki-ca' -t ",," -i /tmp/subsystem.pem -f $PWDFILE
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
更新 LDAP 中相应的条目,类似于 RA agent 步骤:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
IDM.EXAMPLE.COM
替换为您的 IdM 域,或使用您的自定义证书主题库。
为副本的 LDAP 服务手动发布临时证书。
在故障副本上,从目录服务器的 NSS 数据库中的现有密钥生成一个证书签名请求(CSR):
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意以上命令会创建
/tmp/ldap.csr
。有些certutil
版本可能会向文件中添加额外的文本。确保文件仅包含-----BEGIN NEW CERTIFICATE REQUEST-----
块,而不包含任何其他内容。如果证书是由 IdM CA 签名的:
在故障副本上,将 CSR 复制到续订服务器中:
scp /tmp/ldap.csr root@renewal-master.idm.example.com:/tmp/
# scp /tmp/ldap.csr root@renewal-master.idm.example.com:/tmp/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在续订服务器上,签署 CSR。使用
ldap/
主体确保证书对 GSSAPI 绑定是有效的:ipa cert-request /tmp/ldap.csr --principal="ldap/$(hostname -f)" --certificate-out=/tmp/ldap.pem
# ipa cert-request /tmp/ldap.csr --principal="ldap/$(hostname -f)" --certificate-out=/tmp/ldap.pem
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在续订服务器上,将新证书复制回副本:
scp /tmp/ldap.pem root@failed-replica.idm.example.com:/tmp/
# scp /tmp/ldap.pem root@failed-replica.idm.example.com:/tmp/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在故障副本上,将新证书导入到目录服务器的 NSS 数据库中:
certutil -D -d "/etc/dirsrv/${DS_INSTANCE}" -n ${LDAP_CERT_NICKNAME} -f "${PWDFILE}" certutil -A -d "/etc/dirsrv/${DS_INSTANCE}" -n ${LDAP_CERT_NICKNAME} -t ",," -i /tmp/ldap.pem -f "${PWDFILE}"
# certutil -D -d "/etc/dirsrv/${DS_INSTANCE}" -n ${LDAP_CERT_NICKNAME} -f "${PWDFILE}" # certutil -A -d "/etc/dirsrv/${DS_INSTANCE}" -n ${LDAP_CERT_NICKNAME} -t ",," -i /tmp/ldap.pem -f "${PWDFILE}"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
如果证书是由外部 CA 签名的:
-
使用
/tmp/ldap.csr
文件,并将其提交给外部证书颁发机构进行签名。 -
收到新的证书文件(例如
new_ldap_cert.pem
)后,将其安全地复制到故障副本上的/tmp/
目录中,并将它重命名为ldap.pem
。 在故障副本上,将新证书导入到目录服务器的 NSS 数据库中:
certutil -D -d "/etc/dirsrv/${DS_INSTANCE}" -n ${ LDAP_CERT_NICKNAME} -f "${PWDFILE}" certutil -A -d "/etc/dirsrv/${DS_INSTANCE}" -n ${ LDAP_CERT_NICKNAME} -t ",," -i /tmp/ldap.pem -f "${PWDFILE}"
# certutil -D -d "/etc/dirsrv/${DS_INSTANCE}" -n ${ LDAP_CERT_NICKNAME} -f "${PWDFILE}" # certutil -A -d "/etc/dirsrv/${DS_INSTANCE}" -n ${ LDAP_CERT_NICKNAME} -t ",," -i /tmp/ldap.pem -f "${PWDFILE}"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
使用
为副本的 PKI Tomcat 服务手动发布一个临时证书。
在受影响的副本上,使用存储在 PKI Tomcat NSS 数据库中的现有密钥生成一个 CSR:
HOSTNAME=$(hostname -f) PWDFILE="/etc/pki/pki-tomcat/alias/pwdfile.txt" certutil -R -d /etc/pki/pki-tomcat/alias -k 'Server-Cert cert-pki-ca' -n 'Server-Cert cert-pki-ca' -s "CN=${HOSTNAME},O=IDM.EXAMPLE.COM" -a -f "${PWDFILE}" -o /tmp/server-cert.csr
# HOSTNAME=$(hostname -f) # PWDFILE="/etc/pki/pki-tomcat/alias/pwdfile.txt" # certutil -R -d /etc/pki/pki-tomcat/alias -k 'Server-Cert cert-pki-ca' -n 'Server-Cert cert-pki-ca' -s "CN=${HOSTNAME},O=IDM.EXAMPLE.COM" -a -f "${PWDFILE}" -o /tmp/server-cert.csr
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
IDM.EXAMPLE.COM
替换为您的 IdM 域,或使用您的自定义证书主题库。在故障副本上,将 CSR 复制到续订服务器中:
scp /tmp/server-cert.csr root@renewal-master.idm.example.com:/tmp/
# scp /tmp/server-cert.csr root@renewal-master.idm.example.com:/tmp/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在续订服务器上,签署 CSR。为 web 服务器证书使用
host/
主体:ipa cert-request /tmp/server-cert.csr --principal="host/$(hostname -f)" --certificate-out=/tmp/server-cert.pem
# ipa cert-request /tmp/server-cert.csr --principal="host/$(hostname -f)" --certificate-out=/tmp/server-cert.pem
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在续订服务器上,将新证书复制回副本:
scp /tmp/server-cert.pem root@failed-replica.idm.example.com:/tmp/
# scp /tmp/server-cert.pem root@failed-replica.idm.example.com:/tmp/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在故障副本上,将新证书导入到 PKI Tomcat NSS 数据库中:
certutil -D -d /etc/pki/pki-tomcat/alias -n 'Server-Cert cert-pki-ca' -f "${PWDFILE}" certutil -A -d /etc/pki/pki-tomcat/alias -n 'Server-Cert cert-pki-ca' -t ",," -i /tmp/server-cert.pem -f "${PWDFILE}"
# certutil -D -d /etc/pki/pki-tomcat/alias -n 'Server-Cert cert-pki-ca' -f "${PWDFILE}" # certutil -A -d /etc/pki/pki-tomcat/alias -n 'Server-Cert cert-pki-ca' -t ",," -i /tmp/server-cert.pem -f "${PWDFILE}"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
重启服务并续订剩余的证书。
重启副本上的 IdM 服务以使用新证书:
ipactl restart
# ipactl restart
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
certmonger
服务以应用手动更改。重启后,它应该开始尝试续订任何剩余的证书:systemctl restart certmonger
# systemctl restart certmonger
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
您可以通过定期运行
getcert list | grep -E "Request ID|status|expires"
来监视续订过程。所有证书都处于MONITORING
状态后,过程完成。 certmonger
服务现在应该可以与 CA 进行通信。如果一个或多个证书在几分钟后仍然未续订,请考虑手动续订它们:getcert list getcert resubmit -i <REQUEST_ID>
# getcert list # getcert resubmit -i <REQUEST_ID>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow