通过外部 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,请按以下步骤操作:
生成从属 CA 证书签名请求 (CSR):第一步是为从属 CA 生成 CSR,然后下载 CSR。
获取由外部根 CA 签名的从属 CA 证书:第二步是将 CSR 提交给外部根 CA 进行签名。请务必按照外部根 CA 的具体说明提交 CSR 并获取已签名证书。
将已签名的子 CA 证书导入 CA 服务:最后一步是使用 Google Cloud CLI 或 Google Cloud 控制台上传已签名的 PEM 证书链。
以下部分介绍了如何通过外部根 CA 创建从属 CA。
创建 CSR
控制台
访问 Google Cloud 控制台中的 Security > Certificate Authority Service 菜单。
点击 CA 管理器标签页。
点击创建 CA。
选择 CA 类型:
- 点击从属 CA。
- 在 Valid for(有效期)字段中,输入您希望由 CA 证书颁发的证书的有效期。
- 点击根 CA 是外部 CA。
- 为 CA Tier(层级)选择一个可用选项。如需了解详情,请参阅选择操作层级。
- 在区域化下,从列表中选择一个认证机构位置。
- 点击下一步。
- 在组织 (O) 字段中,输入贵公司的名称。
- 可选:在组织部门 (OU) 字段中,输入公司分支或业务部门。
- 可选:在国家/地区名称字段中,输入两个字母的国家/地区代码。
- 可选:在州或省名称字段中,输入您所在的州/省的名称。
- 可选:在地理位置名称字段中,输入您所在的城市的名称。
- 在 CA 通用名称 (CN) 字段中,输入 CA 名称。
- 在 Pool ID 字段中,输入 CA 池名称。CA 一经创建,便无法更改 CA 池。
- 点击下一步。
- 选择最符合您需求的密钥算法。如需了解如何确定合适的密钥算法,请参阅选择密钥算法。
- 点击下一步。
以下步骤是可选的。如果您跳过这些步骤,系统会应用默认设置。
- 选择要使用 Google 管理的 Cloud Storage 存储桶还是自行管理的 Cloud Storage 存储桶。
- 选择是否要停用将证书吊销列表 (CRL) 和 CA 证书发布到 Cloud Storage 存储桶的功能。
- 点击下一步。
如果您未选择自有 Cloud Storage 存储桶,CA Service 会在与 CA 相同的位置创建一个 Google 管理的存储桶。
默认情况下,系统会启用在 Cloud Storage 存储桶中发布 CRL 和 CA 证书的功能。如需停用这些设置,请点击相应切换开关。
以下步骤是可选的。
如果您想向 CA 添加标签,请执行以下操作:
- 点击 Add item(添加内容)。
- 在密钥 1 字段中,输入标签键。
- 在值 1 字段中,输入标签值。
- 如果您想添加其他标签,请点击 Add item(添加项)。然后,添加标签键和值(如第 2 步和第 3 步所述)。
- 点击下一步。
仔细检查所有设置,然后点击创建以创建 CA。
下载 CSR
- 在证书授权机构页面上,选择要启用的 CA。
- 点击 Activate(激活)。
在随即打开的对话框中,点击
Download CSR(下载 CSR)。
gcloud
如需为从属 CA 创建 CA 池,请运行以下命令。如需了解详情,请参阅创建 CA 池。
gcloud privateca pools create SUBORDINATE_POOL_ID
将 SUBORDINATE_POOL_ID 替换为 CA 池的名称。
如需在创建的 CA 池中创建从属 CA,请运行以下
gcloud
命令。gcloud
命令还会创建 CSR 并将其保存到 FILE_NAME 文件。gcloud privateca subordinates create SUBORDINATE_CA_ID \ --pool=SUBORDINATE_POOL_ID \ --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 池的名称。
- FILE_NAME:用于写入 PEM 编码 CSR 的文件的名称。
--key-algorithm
标志采用您要用于为 CA 创建受管 Cloud HSM 密钥的加密算法。--subject
标志采用证书正文的 X.501 名称。如需详细了解
gcloud privateca subordinates create
命令,请参阅 gcloud privateca subordinates create。
创建 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
Terraform
如需在该 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" }
如需提取 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 }
运行
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 为从属 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,请执行以下操作:
控制台
前往 Google Cloud 控制台中的 Certificate Authority Service 页面。
点击 CA 管理器标签页。
在证书授权机构下,选择您创建的子级 CA。
点击
Activate(激活)。在打开的对话框中,点击 Download CSR(下载 CSR),下载可供签发 CA 签名的 PEM 编码 CSR 文件。
点击下一步。
在上传证书链字段中,点击浏览。
上传扩展名为
.crt
的已签名证书文件。点击激活。
gcloud
gcloud privateca subordinates activate SUBORDINATE_CA_ID \
--pool=SUBORDINATE_POOL_ID \
--pem-chain ./chain.crt
替换以下内容:
- SUBORDINATE_CA_ID:您要激活的从属 CA 的唯一标识符。
- SUBORDINATE_POOL_ID:包含从属 CA 的 CA 池的名称。
--pem-chain
标志是必需的。此标志接受包含 PEM 编码证书列表的文件。证书列表以当前 CA 证书开头,以根 CA 证书结尾。
如需详细了解 gcloud privateca subordinates activate
命令,请参阅 gcloud privateca subordinates activate。
上传已签名的证书后,系统会返回以下语句:
Activated certificate authority [SUBORDINATE_CA_ID].
Terraform
- 将已签名的 CA 证书另存为
subordinate.crt
到本地。 - 将 signer CA 证书另存为
rootCA.crt
。 - 移除第一步中提及的用于提取 CSR 的配置,因为它会尝试提取 CSR,而 CA 激活后不允许这样做。
使用以下字段更新子级 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")]
。