19.8. 使用带有 certmonger 的 SCEP

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

19.8.1. SCEP 概述

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

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

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

  • SCEP URL:CA SCEP 接口的 URL。
  • SCEP 共享的 secret:一个在 CA 和 SCEP 客户端之间共享的 challengePassword PIN,用于获取证书。

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

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

19.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 链以指纹的形式显示在命令输出中。当通过未加密的 HTTP 访问服务器时,手动将指纹与 SCEP 服务器中显示的指纹进行比较,以防止中间人攻击。

  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 :证书的别名,在 NSS 数据库中使用。
      • -n: CSR 中的主题名称。
      • -L :CA 发布的一次性时间限制的 challengePassword 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 中的主题名称。
      • -L :CA 发布的一次性时间限制的 challengePassword 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) 手册页列出了其他可能的状态及其含义。

其他资源

  • 有关请求证书时的更多选项,请参阅 getcert-request(1) 手册页。

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

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

作为 SCEP 服务器工作的活动目录(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