自行管理的 SSL 证书是您自行获取、预配和续订的证书。您可以使用此资源来确保客户端与负载平衡器之间的通信安全。
自行管理的证书可以是以下证书类型的任意组合:
- 网域验证 (DV)
- 组织验证 (OV)
- 扩展验证 (EV)
本页面介绍了如何获取有效证书,然后上传证书以创建 Google Cloud SSL 证书资源。
准备工作
- 请确保您熟悉 SSL 证书概览。
- 请确保您拥有要用于自行管理的 SSL 证书的域名。如果您使用的是 Google Domains,请参阅第 1 步:使用 Google Domains 注册域名。
权限
如需执行本指南中的任务,您必须能够在项目中创建和修改 SSL 证书。如果存在以下任一情况,您可以执行此操作:
- 您是 Project Owner 或 Project Editor(
roles/owner
或roles/editor
)。 - 您在项目中同时拥有 Compute Security Admin 角色 (
compute.securityAdmin
) 和 Compute Network Admin 角色 (compute.networkAdmin
)。 - 您在项目中拥有自定义角色,该角色包含
compute.sslCertificates.*
权限以及compute.targetHttpsProxies.*
和/或compute.targetSslProxies.*
,具体取决于您使用的负载平衡器类型。
负载平衡器
您必须为某些类型的 Google Cloud 负载平衡器提供 SSL 证书,这些负载平衡器包括:
第 1 步:创建私钥和证书
如果您已具有证书授权机构 (CA) 颁发的私钥和证书,请跳过此部分并转到创建 SSL 证书资源。
选择或创建私钥
Google Cloud SSL 证书同时包含私钥和证书本身,两者均采用 PEM 格式。您的私钥必须符合以下条件:
- 必须采用 PEM 格式。
- 无法通过密码进行保护。Google Cloud 以专属加密格式存储您的私钥。
- 其加密算法必须是 RSA-2048 或 ECDSA P-256。
您可以使用以下 OpenSSL 命令,创建使用 RSA-2048 加密的 PEM 格式的新私钥。
openssl genrsa -out PRIVATE_KEY_FILE 2048
将 PRIVATE_KEY_FILE 替换为新私钥文件的路径和文件名。
创建 CSR
拥有私钥后,您便可以使用 OpenSSL 生成 PEM 格式的证书签名请求 (CSR)。您的 CSR 必须符合以下条件:
- 必须采用 PEM 格式。
- 必须具有公用名 (
CN
) 或主题备用名称 (SAN
) 特性。实际上,您的证书应该同时包含CN
和SAN
特性(即使是用于单个网域),这是因为,现代的客户端(例如 macOS 和 iOS 的当前版本)不仅仅依赖于CN
特性。
创建一个 OpenSSL 配置文件。 在以下示例中,主题备用名称是在
[sans_list]
中定义的。cat <<'EOF' >CONFIG_FILE [req] default_bits = 2048 req_extensions = extension_requirements distinguished_name = dn_requirements [extension_requirements] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @sans_list [dn_requirements] countryName = Country Name (2 letter code) stateOrProvinceName = State or Province Name (full name) localityName = Locality Name (eg, city) 0.organizationName = Organization Name (eg, company) organizationalUnitName = Organizational Unit Name (eg, section) commonName = Common Name (e.g. server FQDN or YOUR name) emailAddress = Email Address [sans_list] DNS.1 = SUBJECT_ALTERNATIVE_NAME_1 DNS.2 = SUBJECT_ALTERNATIVE_NAME_2 EOF
运行以下 OpenSSL 命令以创建证书签名请求 (CSR) 文件。该命令是交互式的;系统会提示您输入特性(主题备用名称除外,您已在上一步中在 CONFIG_FILE 的
[sans_list]
中定义了)。openssl req -new -key PRIVATE_KEY_FILE \ -out CSR_FILE \ -config CONFIG_FILE
对于这两个步骤,请将占位符替换为有效值:
- CONFIG_FILE:OpenSSL 配置文件的路径,包括文件名。(完成此过程后,您可以删除该文件。)
- SUBJECT_ALTERNATIVE_NAME_1 和 SUBJECT_ALTERNATIVE_NAME_2:证书的主题备用名称。如果您的证书仅用于一个主机名,则只需定义一个与公用名匹配的主题备用名称。如果您需要的主题备用名称超过两个,请将其添加到配置文件中,注意递增
DNS
后面的数字(DNS.3
、DNS.4
等等)。 - PRIVATE_KEY_FILE:私钥文件的路径
- CSR_FILE:CSR 的路径(包括文件名)
为 CSR 签名
当证书授权机构 (CA) 为您的 CSR 签名时,会使用其专属私钥来创建证书。
使用广受信任的 CA
- 如果您请求由广受信任的 CA 为您的 CSR 签名,则所有信任该公共 CA 的客户端都会信任生成的证书。
- 公共 CA 只需要您的 CSR 即可生成签名证书。
管理您自己的 CA
- 如果您管理着自己的 CA,则可以使用它来为 CSR 签名。如果您的客户端也已配置为信任您自己的 CA,则使用 CA 为 CSR 签名以创建内部信任的证书。
使用自签名证书
- 如果您使用用于创建 CSR 的同一私钥为 CSR 签名,则需要创建自签名证书。任何客户端都不会信任自签名证书,除非客户端已配置为跳过证书验证。例如,网络浏览器客户端会显示一条消息,询问您是否要信任自签名证书。自签名证书只能用于测试用途。
如果您管理着自己的 CA,或者想要创建用于测试的自签名证书,则可以使用以下 OpenSSL 命令:
openssl x509 -req \ -signkey PRIVATE_KEY_FILE \ -in CSR_FILE \ -out CERTIFICATE_FILE \ -days TERM
请将占位符替换为有效值:
- PRIVATE_KEY_FILE:您的 CA 的私钥路径;如果创建用于测试的自签名证书,则此私钥与用于创建 CSR 的私钥为同一个。
- CSR_FILE:CSR 的路径
- CERTIFICATE_FILE:要创建的证书文件的路径
- TERM:对证书进行验证的客户端认定该证书有效的天数(从现在起算)
公用名中的通配符
自行管理的 SSL 证书可在公用名中使用通配符。例如,公用名为 *.example.com.
的证书与主机名 www.example.com
和 foo.example.com
匹配,但与 a.b.example.com
或 example.com
不匹配。当负载平衡器选择证书时,它始终会先将主机名与不带通配符的证书进行匹配,然后再与带通配符的证书进行匹配。
带通配符片段(例如 f*.example.com
)的证书不受支持。
第 2 步:创建自行管理的 SSL 证书资源
您必须拥有私钥和证书,然后才能创建 Google Cloud SSL 证书资源。如果您尚未创建或获得私钥和证书,请参阅创建私钥和证书。
控制台
您可以在证书标签页上使用全球 SSL 证书。
- 转到 Google Cloud Console 中的“证书”标签页。
转到“证书”标签 - 点击创建 SSL 证书。
- 为证书输入名称和可选说明。
- 选择上传我的证书。
- 粘贴您的证书,或点击上传以导航到您的证书文件。
您可以选择将 CA 证书链包含到证书所在的文件中。Google Cloud 不会为您验证证书链,您必须自行负责验证。 - 粘贴您的私钥,或点击上传以导航到您的私钥文件。
- 点击创建。
gcloud
如需创建可用于外部 HTTP(S) 负载平衡器或 SSL 代理负载平衡器的全球 SSL 证书,请使用带有 --global
标志的 gcloud compute ssl-certificates
create
命令:
gcloud compute ssl-certificates create CERTIFICATE_NAME \ --certificate=CERTIFICATE_FILE \ --private-key=PRIVATE_KEY_FILE \ --global
如需创建可用于内部 HTTP(S) 负载平衡器的地区 SSL 证书,请使用带有 --region
标志的 gcloud compute ssl-certificates
create
命令:
gcloud compute ssl-certificates create CERTIFICATE_NAME \ --certificate=CERTIFICATE_FILE \ --private-key=PRIVATE_KEY_FILE \ --region=REGION
请将占位符替换为有效值:
- CERTIFICATE_NAME:要创建的全球证书资源的名称
- CERTIFICATE_FILE:指向 PEM 格式的证书文件的路径。 您可以选择将 CA 证书链包含到证书所在的文件中。Google Cloud 不会为您验证证书链,您必须自行负责验证。
- PRIVATE_KEY_FILE:指向 PEM 格式的私钥的路径。私钥无法通过密码进行保护。
- REGION:地区 SSL 证书的地区(如果适用)。如果此证书资源用于内部 HTTP(S) 负载平衡器,则该地区必须与内部 HTTP(S) 负载平衡器所在的地区相同。
API
对于外部 HTTPS 和 SSL 代理负载平衡器,请使用 sslCertificates.insert API 方法。
对于内部 HTTPS 负载平衡器,请使用 regionSslCertificates.insert API 方法。
在使用这些方法之前,您必须先读取证书和私钥文件,因为 API 请求必须发送这些文件的内容。如需查看代码示例,请参阅 API 参考页面。
第 3 步:将 SSL 证书与目标代理相关联
您必须将至少一个 SSL 证书与每个目标 HTTPS 或 SSL 代理相关联。您可以为目标代理配置多个 SSL 证书,但总数量不能超过每个目标 HTTPS 或目标 SSL 代理的 SSL 证书数量上限。您可以在同一个目标代理上引用多个自行管理的证书。
控制台
当您使用 Google Cloud Console 修改现有负载平衡器时,SSL 证书会自动关联至相应的目标代理。
gcloud
如需将全球 SSL 证书与外部 HTTP(S) 负载平衡器的目标 HTTPS 代理相关联,请使用带有 --global
和 --global-ssl-certificates
标志的 gcloud compute target-https-proxies
update
命令:
gcloud compute target-https-proxies update TARGET_PROXY_NAME \ --global \ --ssl-certificates=CERTIFICATE_LIST \ --global-ssl-certificates
如需将全球 SSL 证书与 SSL 代理负载平衡器的目标 SSL 代理相关联,请使用 gcloud compute target-ssl-proxies
update
命令:
gcloud compute target-ssl-proxies update TARGET_PROXY_NAME \ --ssl-certificates=CERTIFICATE_LIST
如需将地区 SSL 证书与内部 HTTP(S) 负载平衡器的目标 HTTPS 代理相关联,请使用带有 --region
和 --ssl-certificates-region
标志的 gcloud compute target-https-proxies
update
命令:
gcloud compute target-https-proxies update TARGET_PROXY_NAME \ --region=REGION \ --ssl-certificates=CERTIFICATE_LIST \ --ssl-certificates-region=REGION
请将占位符替换为有效值:
- TARGET_PROXY_NAME:负载平衡器的目标代理名称
- CERTIFICATE_LIST:以英文逗号分隔的 Google Cloud SSL 证书名称列表
- REGION:如果适用,则为地区目标代理和地区 SSL 证书的地区。
第 4 步:更新 DNS A 和 AAAA 记录以指向负载平衡器的 IP 地址
在您的注册商网站、DNS 主机或 ISP(管理 DNS 记录的任何位置)上,为您的网域和任何子网域添加或更新 DNS A 记录(对于 IPv4)和 DNS AAAA 记录(对于 IPv6),使其指向与负载平衡器的一条或多条转发规则关联的 IP 地址。
如果您使用的是 Cloud DNS 和 Google Domains,请设置您的域名并更新您的域名服务器。
如果您对单个证书使用多个网域,则必须为所有网域和任何子网域添加或更新 DNS 记录,以使其全部指向负载平衡器的 IP 地址。
等待 DNS 传播完成后,您可以通过运行 dig
命令来验证设置。例如,假设您的网域是 www.example.com
。运行以下 dig
命令:
dig www.example.com
; <<>> DiG 9.10.6 <<>> www.example.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: ;; flags: ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: ;; PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: ;; SECTION: ;www.example.com. ;; SECTION: www.example.com. www.example.com.edgekey.net. www.example.com.edgekey.net. www.example.com.edgekey.net.globalredir.akadns.net. www.example.com.edgekey.net.globalredir.akadns.net. e6858.dsce9.akamaiedge.net. e6858.dsce9.akamaiedge.net. 203.0.113.5 ;; time: ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: 16:54:44 ;; rcvd: 31748 qr rd 1 OPT 512 QUESTION IN A ANSWER 1742 IN CNAME 21330 IN CNAME 3356 IN CNAME 19 IN A Query 43 msec Wed Jun 03 PDT 2020 MSG SIZE 193>
在此示例中,203.0.113.5
是您的负载平衡器的 IP 地址。
第 5 步:使用 OpenSSL 进行测试
证书和网域处于活跃状态后,您的负载平衡器最多可能需要 30 分钟才能开始使用自行管理的 SSL 证书。
如需进行测试,请运行以下 OpenSSL 命令,注意将 DOMAIN 替换为您的 DNS 名称,并将 IP_ADDRESS 替换为您的负载平衡器的 IP 地址。
echo | openssl s_client -showcerts -servername DOMAIN -connect IP_ADDRESS:443 -verify 99 -verify_return_error
此命令会输出负载平衡器提供给客户端的证书。输出应包含证书链和 Verify return code: 0 (ok)
以及其他详细信息。
使用自行管理的 SSL 证书
以下部分介绍了如何列出、查看、删除和替换 SSL 证书资源。
列出 SSL 证书
控制台
您可以在负载平衡页面的证书标签页上查看全局 SSL 证书的状态。
- 转到 Google Cloud Console 中的“证书”页面。
转到“证书”页面 - (可选)过滤 SSL 证书列表。
gcloud
如需列出可用于外部 HTTP(S) 负载平衡器或 SSL 代理负载平衡器的全球 SSL 证书,请使用带有 --global
标志的 gcloud compute ssl-certificates
list
命令:
gcloud compute ssl-certificates list \ --global
如需列出可用于内部 HTTP(S) 负载平衡器的地区 SSL 证书,请使用带有 region
过滤条件的 gcloud compute ssl-certificates
list
命令:
gcloud compute ssl-certificates list \ --filter="region:(REGION ...)"
请将占位符替换为有效值:
- REGION:Google Cloud 地区。以空格分隔列表形式添加多个地区。
描述 SSL 证书
控制台
您可以在负载平衡页面的证书标签页上查看有关全局 SSL 证书的更多详细信息。
- 转到 Google Cloud Console 中的“证书”页面。
转到“证书”页面 - (可选)过滤 SSL 证书列表。
- 如需查看更多详细信息,请点击证书名称。
gcloud
如需描述全球 SSL 证书(针对外部 HTTP(S) 负载平衡器或 SSL 代理负载平衡器),请使用带有 --global
标志的 gcloud compute ssl-certificates
describe
命令:
gcloud compute ssl-certificates describe CERTIFICATE_NAME \ --global
如需描述地区 SSL 证书(针对内部 HTTP(S) 负载平衡器),请使用带有 --region
标志的 gcloud compute ssl-certificates
describe
命令:
gcloud compute ssl-certificates describe CERTIFICATE_NAME \ --region=REGION
请将占位符替换为有效值:
- CERTIFICATE_NAME:SSL 证书的名称
- REGION:Google Cloud 地区
删除 SSL 证书
如需删除 SSL 证书,您必须先更新引用该证书的各个目标代理。对于每个目标代理,运行相应的 gcloud update
命令来更新目标代理的 CERTIFICATE_LIST,以使其不再包含要删除的 SSL 证书。请注意,每个目标 SSL 代理或目标 HTTPS 代理必须引用至少一个 SSL 证书。
更新目标代理后,您便可删除 SSL 证书了。
控制台
您可以在负载平衡页面的证书标签页上删除全局 SSL 证书。
- 转到 Google Cloud Console 中的“证书”页面。
转到“证书”页面 - 选择要删除的 SSL 证书。
- 点击 删除。
- 再次点击 删除进行确认。
gcloud
如需删除全球 SSL 证书(针对外部 HTTP(S) 负载平衡器或 SSL 代理负载平衡器),请使用带有 --global
标志的 gcloud compute ssl-certificates
delete
命令:
gcloud compute ssl-certificates delete CERTIFICATE_NAME \ --global
如需删除地区 SSL 证书(针对内部 HTTP(S) 负载平衡器),请使用带有 --region
标志的 gcloud compute ssl-certificates
delete
命令:
gcloud compute ssl-certificates delete CERTIFICATE_NAME \ --region=REGION
请将占位符替换为有效值:
- CERTIFICATE_NAME:SSL 证书的名称
- REGION:Google Cloud 地区
替换 SSL 证书
如果您需要替换或轮替 SSL 证书,请执行以下操作:
- 创建新的 SSL 证书资源。新 SSL 证书在项目中必须具有唯一的名称。
更新目标代理,将新的 SSL 证书置于其 SSL 证书列表的第一个位置,以使该证书成为主证书。在新证书之后,添加您要保留的任何现有 SSL 证书。请务必排除不再需要的旧 SSL 证书。为避免停机,请运行带有
--ssl-certificates
标志的单个gcloud
命令。例如:对于外部 HTTP(S) 负载平衡器:
使用带有
--global
标志的gcloud compute target-https-proxies update
命令。gcloud compute target-https-proxies update TARGET_PROXY_NAME \ --global \ --ssl-certificates=new-ssl-cert,other-certificates \ --global-ssl-certificates
对于内部 HTTP(S) 负载平衡器:
使用带有
--region
标志的gcloud compute target-https-proxies update
命令。gcloud compute target-https-proxies update TARGET_PROXY_NAME \ --region REGION \ --ssl-certificates=new-ssl-cert,other-certificates \ --global-ssl-certificates
对于 SSL 代理负载平衡器:
使用带有
--backend-service
标志的gcloud compute target-ssl-proxies update
命令。gcloud compute target-ssl-proxies update TARGET_PROXY_NAME \ --ssl-certificates=new-ssl-cert,other-certificates
通过运行以下 OpenSSL 命令来验证负载平衡器是否正在提供替换证书:
echo | openssl s_client -showcerts -connect IP_ADDRESS:443 -verify 99 -verify_return_error
等待 15 分钟,以确保替换证书可供所有 Google Front End (GFE) 使用。
(可选)删除旧的 SSL 证书。
定期轮替 SSL 证书
此示例解决方案会定期检查与 Google Cloud 负载平衡器搭配使用的证书的状态,并在其生命周期内达到指定百分比时轮替证书。该工具使用通过证书授权机构服务配置的 CA。
此解决方案与以下负载平衡器配合使用:
- 外部 HTTP(S) 负载平衡器
- 内部 HTTP(S) 负载平衡器
- SSL 代理负载平衡器
后续步骤
- 如需对 SSL 证书进行问题排查,请参阅对 SSL 证书进行问题排查。