Red Hat Training

A Red Hat training course is available for RHEL 8

74.8. 使用 SCEP 和 certmonger

简单证书注册协议(SCEP)是可在不同设备和操作系统中使用的证书管理协议。如果您在环境中使用 SCEP 服务器作为外部证书颁发机构(CA),您可以使用 certmonger 获取 Identity Management(IdM)客户端的证书。

74.8.1. SCEP 概述

简单证书注册协议(SCEP)是可在不同设备和操作系统中使用的证书管理协议。您可以使用 SCEP 服务器作为外部证书颁发机构(CA)。

您可以配置 Identity Management(IdM)客户端,以直接从 CA SCEP 服务通过 HTTP 请求并检索证书。此过程由共享 secret 保护,该 secret 通常仅对有限时间有效。

在客户端,SCEP 要求您提供以下组件:

  • SCEP URL:CA SCEP 接口的 URL。
  • SCEP 共享 secret:在 CA 和 SCEP 客户端之间共享 质询密码 PIN,用于获取证书。

然后,客户端通过 SCEP 检索 CA 证书链,并将证书签名请求发送到 CA。

使用 certmonger 配置 SCEP 时,您可以创建一个新的 CA 配置配置文件,该配置文件指定了签发的证书参数。

74.8.2. 通过 SCEP 请求 IdM CA 签名证书

以下示例将 SCEP_example SCEP CA 配置添加到 certmonger,并在 client.idm.example.com IdM 客户端上请求新证书。certmonger 支持 NSS 证书数据库格式和基于文件的(PEM)格式,如 OpenSSL。

先决条件

  • 您知道 SCEP URL。
  • 您有 challengePassword PIN 共享 secret。

流程

  1. 将 CA 配置添加到 certmonger

    [root@client.idm.example.com ~]# getcert add-scep-ca -c SCEP_example -u SCEP_URL
    • -c: CA 配置强制别名。稍后可以将相同的值用于其他 getcert 命令。
    • -u:服务器的 SCEP 接口的 URL。

      重要

      使用 HTTPS URL 时,还必须使用 -R 选项指定 SCEP 服务器 CA 证书的 PEM 格式副本的位置。

  2. 验证 CA 配置是否已成功添加:

    [root@client.idm.example.com ~]# getcert list-cas -c SCEP_example
    CA 'SCEP_example':
           is-default: no
           ca-type: EXTERNAL
           helper-location: /usr/libexec/certmonger/scep-submit -u http://SCEP_server_enrollment_interface_URL
           SCEP CA certificate thumbprint (MD5): A67C2D4B 771AC186 FCCA654A 5E55AAF7
           SCEP CA certificate thumbprint (SHA1): FBFF096C 6455E8E9 BD55F4A5 5787C43F 1F512279

    如果成功添加了配置,certmonger 从远程 CA 检索 CA 链。然后,CA 链在命令输出中显示为 thumbprints。当通过未加密的 HTTP 访问服务器时,手动将 thumbprints 与 SCEP 服务器中显示的 thumbprints 进行比较,以防止 man-in-the-middle 攻击。

  3. 从 CA 请求证书:

    • 如果您使用 NSS:

      [root@client.idm.example.com ~]# getcert request -I Example_Task -c SCEP_example -d /etc/pki/nssdb -n ExampleCert -N cn="client.idm.example.com" -L one-time_PIN -D client.idm.example.com

      您可以使用选项来指定证书请求的以下参数:

      • 任务的 -I:(可选) 名称:请求的跟踪 ID。稍后可以将相同的值用于 getcert list 命令。
      • -c :将请求提交到的 CA 配置。
      • -d :包含 NSS 数据库的目录来存储证书和密钥。
      • -n :证书 Nickname,在 NSS 数据库中使用。
      • -n: CSR 中的 Subject 名称。
      • -L : CA 发布时限一次性 质询Password PIN。
      • - d:证书的主题备用名称,通常与主机名相同。
    • 如果您使用 OpenSSL:

      [root@client.idm.example.com ~]# getcert request -I Example_Task -c SCEP_example -f /etc/pki/tls/certs/server.crt -k /etc/pki/tls/private/private.key -N cn="client.idm.example.com" -L one-time_PIN -D client.idm.example.com

      您可以使用选项来指定证书请求的以下参数:

      • 任务的 -I:(可选) 名称:请求的跟踪 ID。稍后可以将相同的值用于 getcert list 命令。
      • -c :将请求提交到的 CA 配置。
      • -f :到证书的存储路径。
      • -k:到密钥的存储路径。
      • -n: CSR 中的 Subject 名称。
      • -L : CA 发布时限一次性 质询Password PIN。
      • - d:证书的主题备用名称,通常与主机名相同。

验证

  1. 验证证书是否已颁发并正确存储在本地数据库中:

    • 如果您使用了 NSS,请输入:

      [root@client.idm.example.com ~]# getcert list -I Example_Task
      	Request ID 'Example_Task':
              status: MONITORING
              stuck: no
              key pair storage: type=NSSDB,location='/etc/pki/nssdb',nickname='ExampleCert',token='NSS Certificate DB'
              certificate: type=NSSDB,location='/etc/pki/nssdb',nickname='ExampleCert',token='NSS Certificate DB'
              signing request thumbprint (MD5): 503A8EDD DE2BE17E 5BAA3A57 D68C9C1B
              signing request thumbprint (SHA1): B411ECE4 D45B883A 75A6F14D 7E3037F1 D53625F4
              CA: IPA
              issuer: CN=Certificate Authority,O=EXAMPLE.COM
              subject: CN=client.idm.example.com,O=EXAMPLE.COM
              expires: 2018-05-06 10:28:06 UTC
              key usage: digitalSignature,keyEncipherment
              eku: iso.org.dod.internet.security.mechanisms.8.2.2
              certificate template/profile: IPSECIntermediateOffline
              pre-save command:
              post-save command:
              track: yes
      	auto-renew: yes
    • 如果使用 OpenSSL,请输入:

      [root@client.idm.example.com ~]# getcert list -I Example_Task
      Request ID 'Example_Task':
             status: MONITORING
             stuck: no
             key pair storage: type=FILE,location='/etc/pki/tls/private/private.key'
             certificate: type=FILE,location='/etc/pki/tls/certs/server.crt'
             CA: IPA
             issuer: CN=Certificate Authority,O=EXAMPLE.COM
             subject: CN=client.idm.example.com,O=EXAMPLE.COM
             expires: 2018-05-06 10:28:06 UTC
             eku: id-kp-serverAuth,id-kp-clientAuth
             pre-save command:
             post-save command:
             track: yes
             auto-renew: yes

      状态 MONITORING 表示成功检索签发的证书。getcert-list(1) man page 列出了其他可能的状态及其含义。

其它资源

  • 有关请求证书时的更多信息,请参阅 getcert-request(1) man page。

74.8.3. 使用 certmonger 自动续订 AD SCEP 证书

certmonger 发送 SCEP 证书签名请求时,此请求将使用现有证书私钥签名。但是,默认由 certmonger 发送的续订请求还包括用于获取证书的 challengePassword PIN。

作为 SCEP 服务器的 Active Directory(AD)网络设备注册服务(NDES)服务器会自动拒绝包含原始 challengePassword PIN 的续订请求。因此,续订会失败。

要与 AD 续订,您需要配置 certmonger,以在没有 challengePassword PIN 的情况下发送签名的续订请求。您还需要配置 AD 服务器,使其不会在续订时比较主题名称。

注意

AD 以外的 SCEP 服务器也会拒绝包含 challengePassword 的请求。在这些情况下,您可能还需要以这种方式更改 certmonger 配置。

先决条件

  • RHEL 服务器必须正在运行 RHEL 8.6 或更新版本。

流程

  1. 在 AD 服务器上打开 regedit
  2. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\MSCEP 子键中,添加一个新的 32 位 REG_DWORD 条目 DisableRenewalSubjectNameMatch,并将其值设为 1
  3. 在运行 certmonger 的服务器上,打开 /etc/certmonger/certmonger.conf 文件,并添加以下部分:

    [scep]
    challenge_password_otp = yes
  4. 重启 certmonger:

    # systemctl restart certmonger