第 22 章 从过期的系统证书中恢复


如果身份管理(IdM)证书过期了,核心服务(如 Web UI、LDAP 和证书颁发)失败。ipa-certupdateipa-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
Copy to Clipboard Toggle word wrap

如果 Kerberos 不可用,请使用以下命令和目录管理器密码:

# ldapsearch -x -D 'cn=Directory Manager' -W -b cn=masters,cn=ipa,cn=etc,dc=example,dc=com ipaConfigString=caRenewalMaster dn
Copy to Clipboard Toggle word wrap

流程

  1. 验证 IdM 服务是否正在运行:

    # ipactl status
    Copy to Clipboard Toggle word wrap
  2. 可选。如果任何服务都没有运行,请强制它们启动:

    # ipactl start -f
    Copy to Clipboard Toggle word wrap

    -f--force 标志绕过一些启动检查,这在服务因为过期的证书而无法进行通信时是必需的。

  3. 比较续订服务器和故障副本之间的 RA Agent 和 Subsystem 证书。

    在健康的续订服务器和故障副本上,检索 RA Agent 和 subsystem 证书的序列号,并验证它们是否一样。

    1. 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
      Copy to Clipboard Toggle word wrap
    2. 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
      Copy to Clipboard Toggle word wrap

      如果副本上的序列号与 CA 续订服务器上的序列号不匹配,请执行下一步来同步它们。

  4. 将健康的证书手动复制到副本。将 ra-agent.pem 和 subsystem 证书从续订服务器复制到故障副本。

    1. 复制 RA agent 证书文件:

      # scp /var/lib/ipa/ra-agent.pem root@failed-replica.idm.example.com:/tmp/
      Copy to Clipboard Toggle word wrap
    2. 导出 subsystem 证书:

      # certutil -L -d /etc/pki/pki-tomcat/alias -n 'subsystemCert cert-pki-ca' -a > /tmp/subsystem.pem
      Copy to Clipboard Toggle word wrap
    3. 复制 subsystem 证书:

      # scp /tmp/subsystem.pem root@failed-replica.idm.example.com:/tmp/
      Copy to Clipboard Toggle word wrap
  5. 在故障副本上,替换过期的 RA agent 证书。

    1. 将健康的证书复制到合适的地方:

      # cp /tmp/ra-agent.pem /var/lib/ipa/ra-agent.pem
      Copy to Clipboard Toggle word wrap
    2. 更新 LDAP 中相应的条目,以确保它包含正确的证书 blob 和序列号。此步骤需要目录管理器密码。

      1. 通过将新的 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)
        Copy to Clipboard Toggle word wrap
      2. 从新证书中提取序列号,并将其存储在变量中:

        # RA_CERT_SERIAL=$(openssl x509 -in /tmp/ra-agent.pem -noout -serial | cut -d'=' -f2)
        Copy to Clipboard Toggle word wrap
      3. 确保 IdM 服务在尝试修改 LDAP 数据库之前正在运行:

        # ipactl start -f
        Copy to Clipboard Toggle word wrap
      4. 使用新证书 blob 和序列号更新 RA agent 的 LDAP 条目。系统将提示您输入目录管理器密码:

        # ldapmodify -D "cn=Directory Manager" -W -x <<EOF
        dn: uid=ipara,ou=people,o=ipaca
        changetype: modify
        add: userCertificate
        userCertificate:: ${RA_CERT_BLOB}
        
        replace: description
        description: 2;${RA_CERT_SERIAL};CN=Certificate Authority,O=IDM.EXAMPLE.COM;CN=IPA RA,O=IDM.EXAMPLE.COM
        EOF
        Copy to Clipboard Toggle word wrap

        IDM.EXAMPLE.COM 替换为您的 IdM 域,或使用您的自定义证书主题库。

  6. 在故障副本上,替换过期的 subsystem 证书。

    1. 将健康的证书导入到 NSS 数据库中。这需要 NSS 数据库密码,该密码可在 /etc/pki/pki-tomcat/password.conf 中找到。

      1. 为 NSS 数据库密码文件的位置设置一个变量,以便在以下命令中更轻松地使用:

        # PWDFILE=/etc/pki/pki-tomcat/alias/pwdfile.txt
        Copy to Clipboard Toggle word wrap
      2. 从 NSS 数据库中删除旧、过期的 subsystem 证书:

        # certutil -D -d /etc/pki/pki-tomcat/alias -n 'subsystemCert cert-pki-ca' -f $PWDFILE
        Copy to Clipboard Toggle word wrap
      3. /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
        Copy to Clipboard Toggle word wrap
    2. 更新 LDAP 中相应的条目,类似于 RA agent 步骤:

      # SUBSYS_CERT_BLOB=$(cat /tmp/subsystem.pem | sed -rn '/^-----BEGIN CERTIFICATE-----$/{:1;n;/^-----END CERTIFICATE-----$/b2;H;b1};:2;${x;s/\s//g;p}')
      
      # SUBSYS_CERT_SERIAL=$(openssl x509 -in /tmp/subsystem.pem -noout -serial | cut -d'=' -f2)
      
      # ldapmodify -D "cn=Directory Manager" -W -x <<EOF
      dn: uid=pkidbuser,ou=people,o=ipaca
      changetype: modify
      add: userCertificate
      userCertificate:: ${SUBSYS_CERT_BLOB}
      
      replace: description
      description: 2;${SUBSYS_CERT_SERIAL};CN=Certificate Authority,O=IDM.EXAMPLE.COM;CN=CA Subsystem,O=IDM.EXAMPLE.COM
      EOF
      Copy to Clipboard Toggle word wrap

      IDM.EXAMPLE.COM 替换为您的 IdM 域,或使用您的自定义证书主题库。

  7. 为副本的 LDAP 服务手动发布临时证书。

    1. 在故障副本上,从目录服务器的 NSS 数据库中的现有密钥生成一个证书签名请求(CSR):

      # DS_INSTANCE=$(grep ldap_uri /etc/ipa/default.conf | sed -n 's|.%2Frun%2F\(slapd-\)\.socket.|\1|p')*
      
      # LDAP_CERT_NICKNAME=$(grep nsSSLPersonalitySSL "/etc/dirsrv/${DS_INSTANCE}/dse.ldif" | awk '{ print $2 }')
      
      # HOSTNAME=$(hostname -f)
      
      # PWDFILE="/etc/dirsrv/${DS_INSTANCE}/pwdfile.txt"
      
      # certutil -R -d "/etc/dirsrv/${DS_INSTANCE}" -k ${LDAP_CERT_NICKNAME} -n ${LDAP_CERT_NICKNAME} -s "CN=${HOSTNAME}" -a -f "${PWDFILE}" -8 "${HOSTNAME}" -o /tmp/ldap.csr
      Copy to Clipboard Toggle word wrap
      注意

      以上命令会创建 /tmp/ldap.csr。有些 certutil 版本可能会向文件中添加额外的文本。确保文件仅包含 -----BEGIN NEW CERTIFICATE REQUEST----- 块,而不包含任何其他内容。

    2. 如果证书是由 IdM CA 签名的:

      1. 在故障副本上,将 CSR 复制到续订服务器中:

        # scp /tmp/ldap.csr root@renewal-master.idm.example.com:/tmp/
        Copy to Clipboard Toggle word wrap
      2. 在续订服务器上,签署 CSR。使用 ldap/ 主体确保证书对 GSSAPI 绑定是有效的:

        # ipa cert-request /tmp/ldap.csr --principal="ldap/$(hostname -f)" --certificate-out=/tmp/ldap.pem
        Copy to Clipboard Toggle word wrap
      3. 在续订服务器上,将新证书复制回副本:

        # scp /tmp/ldap.pem root@failed-replica.idm.example.com:/tmp/
        Copy to Clipboard Toggle word wrap
      4. 在故障副本上,将新证书导入到目录服务器的 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}"
        Copy to Clipboard Toggle word wrap
    3. 如果证书是由外部 CA 签名的:

      1. 使用 /tmp/ldap.csr 文件,并将其提交给外部证书颁发机构进行签名。
      2. 收到新的证书文件(例如 new_ldap_cert.pem)后,将其安全地复制到故障副本上的 /tmp/ 目录中,并将它重命名为 ldap.pem
      3. 在故障副本上,将新证书导入到目录服务器的 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}"
        Copy to Clipboard Toggle word wrap
  8. 为副本的 PKI Tomcat 服务手动发布一个临时证书。

    1. 在受影响的副本上,使用存储在 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
      Copy to Clipboard Toggle word wrap

      IDM.EXAMPLE.COM 替换为您的 IdM 域,或使用您的自定义证书主题库。

    2. 在故障副本上,将 CSR 复制到续订服务器中:

      # scp /tmp/server-cert.csr root@renewal-master.idm.example.com:/tmp/
      Copy to Clipboard Toggle word wrap
    3. 在续订服务器上,签署 CSR。为 web 服务器证书使用 host/ 主体:

      # ipa cert-request /tmp/server-cert.csr --principal="host/$(hostname -f)" --certificate-out=/tmp/server-cert.pem
      Copy to Clipboard Toggle word wrap
    4. 在续订服务器上,将新证书复制回副本:

      # scp /tmp/server-cert.pem root@failed-replica.idm.example.com:/tmp/
      Copy to Clipboard Toggle word wrap
    5. 在故障副本上,将新证书导入到 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}"
      Copy to Clipboard Toggle word wrap
  9. 重启服务并续订剩余的证书。

    1. 重启副本上的 IdM 服务以使用新证书:

      # ipactl restart
      Copy to Clipboard Toggle word wrap
    2. 重启 certmonger 服务以应用手动更改。重启后,它应该开始尝试续订任何剩余的证书:

      # systemctl restart certmonger
      Copy to Clipboard Toggle word wrap
    3. 您可以通过定期运行 getcert list | grep -E "Request ID|status|expires" 来监视续订过程。所有证书都处于 MONITORING 状态后,过程完成。
    4. certmonger 服务现在应该可以与 CA 进行通信。如果一个或多个证书在几分钟后仍然未续订,请考虑手动续订它们:

      # getcert list
      
      # getcert resubmit -i <REQUEST_ID>
      Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat