从外部 CA 创建从属 CA
本页面介绍了如何创建从属证书授权机构 (CA) 链接到一个外部根 CA。
如果您的现有公钥基础设施 (PKI) 层次结构包含 根 CA 和从属 CA,您可以维护相同的根 CA 并创建一个 CA Service 中的从属 CA,链接到您的外部 根 CA。外部根 CA 的密钥和操作仍不在 Google Cloud 范围内。 您只能使用外部根 CA 来颁发从属 CA 证书 Google Cloud从属 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 Service: 最后一步是使用 Google Cloud CLI 或 Google Cloud 控制台。
以下部分介绍如何从 外部根 CA。
创建 CSR
控制台
访问安全 >Certificate Authority Service 菜单位于 Google Cloud 控制台。
点击 CA 管理员标签页。
点击创建 CA。
选择 CA 类型:
- 点击从属 CA。
- 在有效期字段中,输入所需的时长 CA 证书颁发的证书才有效
- 点击根 CA 为外部。
- 选择一个适用于 CA 层级的选项。有关 相关信息,请参阅选择操作层级。
- 在区域化下,从以下位置选择一个 CA 位置: 。
- 点击下一步。
- 在 Organization (O)(组织 (O))字段中,输入公司名称。
- 可选:在组织部门 (OU) 字段中,输入公司 下属行政单位或业务部门。
- 可选:在国家/地区名称字段中,输入由两个字母组成的国家/地区代码。
- 可选:在州或省/直辖市/自治区名称字段中,输入 您所在的州/省。
- 可选:在市行政区名称字段中,输入您所在城市的名称。
- 在 CA 通用名称 (CN) 字段中,输入 CA 名称。
- 在池 ID 字段中,输入 CA 池名称。您无法更改 在创建 CA 后创建的 CA 池。
- 点击下一步。
- 选择最符合您需求的密钥算法。相关信息 如何确定合适的密钥算法,请参阅 选择密钥算法。
- 点击下一步。
以下步骤是可选的。如果您跳过这些步骤, 设置。
- 选择使用由 Google 管理还是自行管理 Cloud Storage 存储桶。
- 选择是否要禁止发布证书 吊销列表 (CRL) 和 CA 证书传送到 Cloud Storage 存储桶。
- 点击下一步。
如果您未选择自行管理的 Cloud Storage 存储桶, CA Service 会在同一 作为 CA 的位置
发布 Cloud Storage 存储桶中的 CRL 和 CA 证书 默认处于启用状态要停用这些设置,请点击切换开关。
以下步骤是可选的。
如果要向 CA 添加标签,请执行以下操作:
- 点击 添加一项。
- 在键 1 字段中,输入标签键。
- 在值 1 字段中,输入标签值。
- 如果您想添加其他标签,请点击 添加项目。然后,添加 标签键和值(如第 2 步和第 3 步所述)。
- 点击下一步。
仔细检查所有设置,然后点击创建以创建 CA。
下载 CSR
- 在证书授权机构页面上,选择要激活的 CA。
- 点击 Activate(启用)。
在打开的对话框中,点击
下载 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
命令:
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,请执行以下操作:
控制台
转到 Certificate Authority Service 页面: Google Cloud 控制台
点击 CA 管理员标签页。
在证书授权机构下,选择您创建的从属 CA。
点击
Activate(启用)。在打开的对话框中,点击下载 CSR 以下载 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
。 - 在本地将签名者 CA 证书保存为
rootCA.crt
。 - 移除第一步中提到的用于提取 CSR 的配置,如下所示 它会尝试提取在 CA 激活后不允许使用的 CSR。
使用以下字段更新从属 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")]
。