从外部 CA 创建从属 CA

本页面介绍了如何创建链接到外部根 CA 的从属证书授权机构 (CA)。

如果您有包含根 CA 和从属 CA 的现有公钥基础架构 (PKI) 层次结构,则可以保留相同的根 CA,并在 CA Service 中创建一个链接到外部根 CA 的从属 CA。外部根 CA 的密钥和操作仍保留在 之外 Google Cloud。 您只能使用外部根 CA 向 Google Cloud颁发从属 CA 证书。任何信任外部根 CA 的工作负载都会立即信任从属 CA。然后,您可以使用从属 CA 颁发证书,而无需在运行时回溯到外部根 CA。

准备工作

  • 确保您拥有 CA Service Operation Manager (roles/privateca.caManager) 或 CA Service Admin (roles/privateca.admin) IAM 角色。如需了解相关信息,请参阅 配置 IAM 政策
  • 确定外部根 CA。
  • 为从属 CA 定义名称、正文、有效期和密钥大小。如需了解相关信息,请参阅确定 CA 设置

从外部 CA 创建从属 CA

从外部 CA 创建从属 CA 涉及以下步骤:

  1. 生成从属 CA 证书签名请求 (CSR):第一 步是为从属 CA 生成 CSR,然后下载 CSR。

  2. 获取由外部根 CA 签名的从属 CA 证书: 第二步是将 CSR 提交给外部根 CA 进行签名。请务必遵循外部根 CA 的具体说明来提交 CSR 并获取已签名的证书。

  3. 将已签名的从属 CA 证书导入 CA Service:最后一步是使用 Google Cloud CLI 或控制台上传已签名的 PEM 证书链。 Google Cloud

以下部分介绍了如何从外部根 CA 创建从属 CA。

创建 CSR

控制台

  1. 在 Google Cloud 控制台中,前往 Certificate Authority Service 页面。

    前往 Certificate Authority Service

  2. 点击 CA 管理器 标签页。

  3. 点击创建 CA

选择 CA 类型

  1. 点击从属 CA
  2. 有效期 字段中,输入您希望从属 CA 颁发的证书的有效期。
  3. 点击根 CA 是外部 CA
  4. 为 CA 层级 选择一个可用选项。如需了解更多 信息,请参阅选择操作 层级
  5. 区域化 下,从列表中选择一个 CA 位置
  6. 点击下一步
配置 CA 正文名称
  1. 组织 (O) 字段中,输入您公司的名称。
  2. 可选:在组织部门 (OU) 字段中,输入公司细分或业务单位。
  3. 可选:在国家/地区名称 (C) 字段中,输入双字母国家/地区代码。
  4. 可选:在州/省份名称 字段中,输入您所在州的名称。
  5. 可选:在所在地名称 字段中,输入您所在城市的名称。
  6. CA 通用名称 (CN) 字段中,输入 CA 名称。
  7. 点击继续
配置 CA 密钥大小和算法
  1. 选择最符合您需求的密钥算法。如需详细了解签名密钥选项,请参阅配置 CA 签名密钥
  2. 如需使用客户管理的签名密钥,请选择客户管理的密钥 并提供 Cloud Key Management Service 加密密钥版本。
  3. 点击继续
配置 CA 制品
  1. 选择是要使用 Google 管理的 Cloud Storage 存储桶还是客户管理的 Cloud Storage 存储桶。
    1. 对于 Google 管理的 Cloud Storage 存储桶,CA Service 会在与 CA 相同的位置创建一个 Google 管理的存储桶。
    2. 对于客户管理的 Cloud Storage 存储桶,请点击“浏览”并选择一个现有的 Cloud Storage 存储桶。
  2. 点击继续
添加标签

以下步骤是可选的。

如需向 CA 添加标签,请执行以下操作:

  1. 点击 添加项
  2. 密钥 1 字段中,输入标签键。
  3. 值 1 字段中,输入标签值。
  4. 如需添加其他标签,请点击 添加项。然后,按照第 2 步和第 3 步中的说明添加标签键和值。
  5. 点击继续
查看设置

仔细查看所有设置,然后点击完成 以创建 CA。

下载 CSR

  1. 证书授权机构 页面上,选择要激活的 CA。
  2. 点击 激活
  3. 在随即打开的对话框中,点击 下载 CSR

    下载 CA 的 CSR。

gcloud

  1. 如需为从属 CA 创建 CA 池,请运行以下命令。 如需了解详情,请参阅创建 CA 池

    gcloud privateca pools create SUBORDINATE_POOL_ID --location=LOCATION
    

    替换以下内容:

    • SUBORDINATE_POOL_ID:CA 池的名称。
    • LOCATION:CA 池的位置。
  2. 如需在创建的 CA 池中创建从属 CA,请运行以下 gcloud 命令。gcloud 命令还会创建 CSR 并将其保存 到 FILE_NAME 文件中。

      gcloud privateca subordinates create SUBORDINATE_CA_ID \
          --pool=SUBORDINATE_POOL_ID \
          --location=LOCATION \
          --create-csr --csr-output-file=FILE_NAME \
          --key-algorithm="ec-p256-sha256" \
          --subject="CN=Example Server TLS CA, O=Example LLC"
    

    替换以下内容:

    • SUBORDINATE_CA_ID:从属 CA 的唯一标识符。
    • SUBORDINATE_POOL_ID:CA 池的名称。
    • LOCATION:CA 池的位置。
    • FILE_NAME:PEM 编码的 CSR 写入到的文件的名称。

    --key-algorithm 标志用于指定您要用于为 CA 创建受管 Cloud HSM 密钥的加密算法。

    --subject 标志用于指定证书正文的 X.501 名称。

    如需详细了解 gcloud privateca subordinates create 命令,请参阅 gcloud privateca subordinates create

    如需使用客户管理的签名密钥创建从属 CA,请运行以下命令:

      gcloud privateca subordinates create SUBORDINATE_CA_ID \
          --pool=SUBORDINATE_POOL_ID \
          --location=LOCATION \
          --create-csr --csr-output-file=FILE_NAME \
          --kms-key-version=KMS_KEY_VERSION \
          --subject="CN=Example Server TLS CA, O=Example LLC"
    

    替换以下内容:

    • SUBORDINATE_CA_ID:从属 CA 的唯一标识符。
    • SUBORDINATE_POOL_ID:CA 池的名称。
    • LOCATION:CA 池的位置。
    • FILE_NAME:PEM 编码的 CSR 写入到的文件的名称。
    • KMS_KEY_VERSION:客户管理的 Cloud KMS 加密密钥版本的完整资源 ID,用作签名密钥。

    如需详细了解签名密钥选项和准备客户管理的签名密钥,请参阅配置 CA 签名密钥

创建 CSR 后,系统会返回以下语句:

Created Certificate Authority [projects/my-project-pki/locations/us-west1/caPools/SUBORDINATE_POOL_ID/certificateAuthorities/SUBORDINATE_CA_ID] and saved CSR to FILE_NAME.

如需查看可用设置的完整列表,请运行以下命令:

gcloud privateca subordinates create --help

如果您丢失了 CSR,可以使用以下命令再次下载:

gcloud privateca subordinates get-csr SUBORDINATE_CA_ID \
    --pool=SUBORDINATE_POOL_ID \
    --location=LOCATION

Terraform

  1. 如需在 CA 池中创建 CA 池和从属 CA,请使用以下配置文件:

    resource "google_privateca_ca_pool" "default" {
      name     = "test-ca-pool"
      location = "us-central1"
      tier     = "ENTERPRISE"
    }
    
    resource "google_privateca_certificate_authority" "sub-ca" {
      pool = google_privateca_ca_pool.default.name
      certificate_authority_id = "my-certificate-authority-sub"
      location = "us-central1"
      config {
        subject_config {
          subject {
            organization = "HashiCorp"
            common_name = "my-subordinate-authority"
          }
          subject_alt_name {
            dns_names = ["hashicorp.com"]
          }
        }
        x509_config {
          ca_options {
            is_ca = true
            # Force the sub CA to only issue leaf certs
            max_issuer_path_length = 0
          }
          key_usage {
            base_key_usage {
              cert_sign = true
              crl_sign = true
            }
            extended_key_usage {
            }
         }
       }
      }
      lifetime = "86400s"
      key_spec {
        algorithm = "RSA_PKCS1_4096_SHA256"
      }
      type = "SUBORDINATE"
    }
    
  2. 如需提取 CSR,请添加以下配置。

    data "google_privateca_certificate_authority" "sub-ca-csr" {
      location = "us-central1"
      pool = google_privateca_ca_pool.default.name
      certificate_authority_id = google_privateca_certificate_authority.sub-ca.certificate_authority_id
    }
    
    output "csr" {
      value = data.google_privateca_certificate_authority.sub-ca-csr.pem_csr
    }
    
  3. 运行 terraform apply

为 CSR 签名

将生成的 CSR 文件传递给组织中负责证书颁发的成员,并请求他们为其签名。具体步骤取决于您组织的设置。

您可以使用以下 openssl 命令试用简单的根 CA:

Shell

为新的根 CA 配置设置。

cat > root.conf <<- EOM
[ req ]
distinguished_name = req_distinguished_name
x509_extensions    = v3_ca
prompt             = no
[ req_distinguished_name ]
commonName = Sample Root
[ v3_ca ]
subjectKeyIdentifier=hash
basicConstraints=critical, CA:true
EOM

创建新的根 CA。

openssl req -x509 -new -nodes -config root.conf -keyout rootCA.key \
  -days 3000 -out rootCA.crt -batch

配置必须添加到新的从属 CA 证书的扩展程序。

cat > extensions.conf <<- EOM
basicConstraints=critical,CA:TRUE,pathlen:0
keyUsage=critical,keyCertSign,cRLSign
extendedKeyUsage=critical,serverAuth
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid
EOM

使用此根为从属 CA 的 CSR 签名。

openssl x509 -req -in FILE_NAME -CA rootCA.crt -CAkey rootCA.key \
  -CAcreateserial -out subordinate.crt -days 1095 -sha256 -extfile extensions.conf

将整个证书链连接到单个文件中。

cat subordinate.crt > chain.crt
cat rootCA.crt >> chain.crt

上传已签名证书

如需使用已签名证书激活从属 CA,请执行以下操作:

控制台

  1. 前往Certificate Authority Service页面,在 Google Cloud 控制台中。

    前往 Certificate Authority Service

  2. 点击 CA 管理器 标签页。

  3. 证书授权机构 下,选择您 创建的从属 CA。

  4. 点击 激活

  5. 在随即打开的对话框中,点击下载 CSR 以下载颁发 CA 可以签名的 PEM 编码的 CSR 文件。

  6. 点击下一步

  7. 上传证书链 字段中,点击浏览

  8. 上传带有 .crt 扩展名的已签名证书文件。

  9. 点击激活

gcloud

gcloud privateca subordinates activate SUBORDINATE_CA_ID \
    --pool=SUBORDINATE_POOL_ID \
    --location=LOCATION \
    --pem-chain ./chain.crt

替换以下内容:

  • SUBORDINATE_CA_ID:您要激活的从属 CA 的唯一标识符。
  • SUBORDINATE_POOL_ID:包含从属 CA 的 CA 池的名称。
  • LOCATION:CA 池的位置。如需查看完整的位置列表,请参阅位置

需要 --pem-chain 标志。此标志用于指定包含 PEM 编码的证书列表的文件。证书列表以当前 CA 证书开头,以根 CA 证书结尾。

如需详细了解 gcloud privateca subordinates activate 命令,请参阅 gcloud privateca subordinates activate

上传已签名证书后,系统会返回以下语句:

Activated certificate authority [SUBORDINATE_CA_ID].

Terraform

  1. 将已签名的 CA 证书本地保存为 subordinate.crt
  2. 将签名者 CA 证书本地保存为 rootCA.crt
  3. 移除第一步中提到的用于提取 CSR 的配置,因为它尝试提取在 CA 激活后不允许提取的 CSR。
  4. 使用以下字段更新从属 CA 配置,然后运行 terraform apply

    pem_ca_certificate     = file("subordinate.crt")
    subordinate_config {
      pem_issuer_chain {
          pem_certificates = [file("rootCA.crt")]
      }
    }
    

如果颁发者链包含多个 CA,请将值指定为 [file("intermediateCA.cert"), file("rootCA.crt")]

后续步骤