本页面介绍了如何将实例配置为使用 SSL/TLS。您还可以详细了解 Cloud SQL 如何使用自行管理的 SSL/TLS 证书 安全地连接到 Cloud SQL 实例。
概览
当您创建实例时,Cloud SQL 会自动创建一份服务器证书 (server-ca.pem
)。 我们建议您强制所有连接使用 SSL/TLS 。
如需使用 SSL/TLS 证书验证客户端/服务器身份,您需要创建客户端证书并将证书下载到 MySQL 客户端宿主机。
注意 :Cloud SQL 建议使用双向身份验证,这涉及使用证书同时对客户端和服务器进行身份验证。如下所述强制执行 SSL/TLS 加密将要求所有客户端都进行双向 TLS 身份验证。但是,如果未强制执行 SSL/TLS,您仍然可以使用服务器证书通过非双向 TLS 身份验证进行连接。
如需了解详情,请参阅适用于您的数据库引擎的文档 。
更改 SSL/TLS 证书后,您无需重启实例。如果需要重启,则系统会在 SSL 更新事件期间自动完成重启操作。
强制执行 SSL/TLS 加密
将您的 Cloud SQL 实例设置为接受 SSL/TLS 连接时,该实例将支持 SSL/TLS 连接,但仍然可以接受未加密的不安全连接。如果您不要求所有连接使用 SSL/TLS,那么也会允许没有有效证书的客户端建立连接。
因此,如果您使用公共 IP 地址访问实例,我们强烈建议您对所有连接强制执行 SSL。
启用要求使用 SSL/TLS 选项后,您可以使用 Cloud SQL 身份验证代理或 SSL/TLS 证书连接到 Cloud SQL 实例。使用 Cloud SQL 身份验证代理不需要 SSL/TLS 证书,因为无论设置如何,连接都已加密。
如需启用要求使用 SSL/TLS,请执行以下操作:
控制台
在 Google Cloud Console 中,转到 Cloud SQL 实例 页面。
转到“Cloud SQL 实例”
如需打开实例的概览 页面,请点击实例名称。
点击 SQL 导航菜单中的连接 。
选择安全 标签页。
点击只允许 SSL 连接 。
gcloud
gcloud sql instances patch INSTANCE_NAME
--require-ssl
REST v1
在使用任何请求数据之前,请先进行以下替换:
project-id :项目 ID
instance-id :实例 ID
HTTP 方法和网址:
PATCH https://sqladmin.googleapis.com/v1/projects/project-id /instances/instance-id
请求 JSON 正文:
{
"settings": {
"ipConfiguration": {"requireSsl": "true"}
}
}
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
curl -X PATCH \ -H "Authorization: Bearer "$(gcloud auth print-access-token) \ -H "Content-Type: application/json; charset=utf-8" \ -d @request.json \ "https://sqladmin.googleapis.com/v1/projects/project-id /instances/instance-id "
PowerShell (Windows)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
$cred = gcloud auth print-access-token $headers = @{ "Authorization" = "Bearer $cred" } Invoke-WebRequest ` -Method PATCH ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -InFile request.json ` -Uri "https://sqladmin.googleapis.com/v1/projects/project-id /instances/instance-id " | Select-Object -Expand Content
您应该会收到类似以下内容的 JSON 响应:
响应
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/v1/projects/project-id /instances/instance-id ",
"status": "PENDING",
"user": "user@example.com",
"insertTime": "2020-01-20T21:30:35.667Z",
"operationType": "UPDATE",
"name": "operation-id ",
"targetId": "instance-id ",
"selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id /operations/operation-id ",
"targetProject": "project-id "
}
REST v1beta4
在使用任何请求数据之前,请先进行以下替换:
project-id :项目 ID
instance-id :实例 ID
HTTP 方法和网址:
PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id
请求 JSON 正文:
{
"settings": {
"ipConfiguration": {"requireSsl": "true"}
}
}
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
curl -X PATCH \ -H "Authorization: Bearer "$(gcloud auth print-access-token) \ -H "Content-Type: application/json; charset=utf-8" \ -d @request.json \ "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id "
PowerShell (Windows)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
$cred = gcloud auth print-access-token $headers = @{ "Authorization" = "Bearer $cred" } Invoke-WebRequest ` -Method PATCH ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -InFile request.json ` -Uri "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id " | Select-Object -Expand Content
您应该会收到类似以下内容的 JSON 响应:
响应
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id ",
"status": "PENDING",
"user": "user@example.com",
"insertTime": "2020-01-20T21:30:35.667Z",
"operationType": "UPDATE",
"name": "operation-id ",
"targetId": "instance-id ",
"selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /operations/operation-id ",
"targetProject": "project-id "
}
服务器证书
当您创建实例时,Cloud SQL 会自动创建一个服务器证书。只要此服务器证书有效,您就无需主动管理服务器证书 。但是,服务器证书是有失效日期的(即 10 年);此日期过后,该证书就不再有效,客户端也无法再使用该证书与您的实例之间建立安全连接。 系统会定期通知您服务器证书即将到期。通知在失效日期前的以下天数发送:90、30、10、2 和 1。
您可以获取服务器证书的相关信息,例如该证书的创建时间和到期时间。您也可以手动创建一个新证书。
控制台
在 Google Cloud Console 中,转到 Cloud SQL 实例 页面。
转到“Cloud SQL 实例”
如需打开实例的概览 页面,请点击实例名称。
点击 SQL 导航菜单中的连接 。
选择安全 标签页。
向下滚动到管理服务器证书 部分。您可以在表中查看服务器证书的失效日期。
gcloud
获取有关服务证书的信息:
gcloud beta sql ssl server-ca-certs list \
--instance=INSTANCE_NAME
创建服务器证书:
gcloud beta sql ssl server-ca-certs create \
--instance=INSTANCE_NAME
将证书信息下载到本地 PEM 文件中:
gcloud beta sql ssl server-ca-certs list \
--format="value(cert)" \
--instance=INSTANCE_NAME > \
FILE_PATH /FILE_NAME .pem
通过将下载的文件复制到客户端主机上并替换现有的 server-ca.pem 文件,将所有客户端更新为使用新信息。
如需提供服务器证书信息作为输出,请使用 Terraform 数据源 :
将以下内容添加到 Terraform 配置文件中:
data "google_sql_ca_certs" "ca_certs" {
instance = google_sql_database_instance.default.name
}
locals {
furthest_expiration_time = reverse(sort([for k, v in data.google_sql_ca_certs.ca_certs.certs : v.expiration_time]))[0]
latest_ca_cert = [for v in data.google_sql_ca_certs.ca_certs.certs : v.cert if v.expiration_time == local.furthest_expiration_time]
}
output "db_latest_ca_cert" {
description = "Latest CA certificate used by the primary database server"
value = local.latest_ca_cert
sensitive = true
}
如要创建 server-ca.pem
文件,请运行以下命令:
terraform output db_latest_ca_cert > server-ca.pem
客户端证书
新建客户端证书
您最多可为每个实例创建 10 个客户端证书。要创建客户端证书,您必须具有 Cloud SQL Admin
IAM 角色 。
以下是您需要了解的关于客户端证书的重要注意事项:
如果您丢失了证书的私钥,则必须新建一个新密钥,私钥无法恢复。
默认情况下,客户端证书的有效期为 10 年。
当客户端证书即将到期时,您不会收到通知。
控制台
在 Google Cloud Console 中,转到 Cloud SQL 实例 页面。
转到“Cloud SQL 实例”
如需打开实例的概览 页面,请点击实例名称。
点击 SQL 导航菜单中的连接 。
选择安全 标签页。
点击创建客户端证书 。
在创建客户端证书 对话框中,添加一个唯一名称。
点击创建 。
在已创建新的 SSL 证书 对话框的第一部分,点击下载 client-key.pem ,将私钥下载到名为 client-key.pem
的文件中。
重要提示 :请将此私钥存储在一个安全位置。 如果私钥丢失,您必须创建一个新的客户端证书。
在第二部分,点击下载 client-cert.pem ,将客户端证书下载到名为 client-cert.pem
的文件中。
在第三部分,点击下载 server-ca.pem ,将服务器证书下载到名为 server-ca.pem
的文件中。
点击关闭 。
gcloud
使用 ssl client-certs create
命令创建客户端证书:
gcloud sql ssl client-certs create CERT_NAME client-key.pem \
--instance=INSTANCE_NAME
重要提示 :请将此私钥存储在一个安全位置。 如果私钥丢失,您必须创建一个新的客户端证书。
使用 ssl client-certs describe
命令检索您刚刚创建的证书的公钥,并将其复制到 client-cert.pem
文件中:
gcloud sql ssl client-certs describe CERT_NAME \
--instance=INSTANCE_NAME \
--format="value(cert)" > client-cert.pem
使用 instances describe
命令将服务器证书复制到 server-ca.pem
文件:
gcloud sql instances describe INSTANCE_NAME \
--format="value(serverCaCert.cert)" > server-ca.pem
REST v1
创建一个 SSL/TLS 证书,为其指定对于此实例唯一的名称:
在使用任何请求数据之前,请先进行以下替换:
project-id :项目 ID
instance-id :实例 ID
client-cert-name :客户端证书名称
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/v1/projects/project-id /instances/instance-id /sslCerts
请求 JSON 正文:
{
"commonName" : "client-cert-name "
}
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
curl -X POST \ -H "Authorization: Bearer "$(gcloud auth print-access-token) \ -H "Content-Type: application/json; charset=utf-8" \ -d @request.json \ "https://sqladmin.googleapis.com/v1/projects/project-id /instances/instance-id /sslCerts"
PowerShell (Windows)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
$cred = gcloud auth print-access-token $headers = @{ "Authorization" = "Bearer $cred" } Invoke-WebRequest ` -Method POST ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -InFile request.json ` -Uri "https://sqladmin.googleapis.com/v1/projects/project-id /instances/instance-id /sslCerts" | Select-Object -Expand Content
您应该会收到类似以下内容的 JSON 响应:
响应
{
"kind": "sql#sslCertsInsert",
"operation": {
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/v1/projects/project-id /instances/instance-id ",
"status": "PENDING",
"user": "user@example.com",
"operationType": "UPDATE",
"name": "operation-id ",
"targetId": "instance-id ",
"selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id /operations/operation-id ",
"targetProject": "doc-test-01",
"insertTime": "2020-02-13T00:11:20.677Z"
},
"serverCaCert": {
"kind": "sql#sslCert",
"certSerialNumber": "server-cert-serial-number ",
"cert": "server-cert-value ",
"commonName": "server-cert-name ,
"sha1Fingerprint": "server-cert-sha1Fingerprint ",
"instance": "instance-id ",
"selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id /instances/instance-id /sslCerts/operation-id ",
"createTime": "2019-11-25T20:12:06.764Z",
"expirationTime": "2029-11-22T20:13:06.764Z"
},
"clientCert": {
"certInfo": {
"kind": "sql#sslCert",
"certSerialNumber": "client-cert-serial-number-2 ",
"cert": "client-cert-value ",
"commonName": "client-cert-name ",
"sha1Fingerprint": "client-cert-sha1Fingerprint-2 ",
"instance": "instance-id ",
"selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id /instances/instance-id /sslCerts/operation-id ",
"createTime": "2020-02-13T00:10:20.595Z",
"expirationTime": "2030-02-10T00:11:20.595Z"
},
"certPrivateKey": "private-key-value "
}
}
将响应中英文引号内的所有证书内容(不包括英文引号本身)复制到本地文件中,如下所示:将 serverCaCert.cert
复制到 server-ca.pem
。
将 clientCert.cert
复制到 client-cert.pem
。
将 certPrivateKey
复制到 client-key.pem
。
重要提示 :请将此私钥存储在一个安全位置。如果私钥丢失,您必须创建一个新的客户端证书。
在使用任何请求数据之前,请先进行以下替换:
project-id :项目 ID
instance-id :实例 ID
activation-policy :激活政策为 ALWAYS 或 NEVER
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/v1/projects/project-id /instances/instance-id /restart
请求 JSON 正文:
{
"settings": {
"activationPolicy": "activation-policy "
}
}
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
curl -X POST \ -H "Authorization: Bearer "$(gcloud auth print-access-token) \ -H "Content-Type: application/json; charset=utf-8" \ -d @request.json \ "https://sqladmin.googleapis.com/v1/projects/project-id /instances/instance-id /restart"
PowerShell (Windows)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
$cred = gcloud auth print-access-token $headers = @{ "Authorization" = "Bearer $cred" } Invoke-WebRequest ` -Method POST ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -InFile request.json ` -Uri "https://sqladmin.googleapis.com/v1/projects/project-id /instances/instance-id /restart" | Select-Object -Expand Content
您应该收到类似以下内容的 JSON 响应:
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/v1/projects/project-id /instances/instance-id ",
"status": "PENDING",
"user": "user@example.com",
"insertTime": "2020-01-20T21:30:35.667Z",
"operationType": "RESTART",
"name": "operation-id ",
"targetId": "instance-id ",
"selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id /operations/operation-id ",
"targetProject": "project-id "
}
REST v1beta4
创建一个 SSL/TLS 证书,为其指定对于此实例唯一的名称:
在使用任何请求数据之前,请先进行以下替换:
project-id :项目 ID
instance-id :实例 ID
client-cert-name :客户端证书名称
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id /sslCerts
请求 JSON 正文:
{
"commonName" : "client-cert-name "
}
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
curl -X POST \ -H "Authorization: Bearer "$(gcloud auth print-access-token) \ -H "Content-Type: application/json; charset=utf-8" \ -d @request.json \ "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id /sslCerts"
PowerShell (Windows)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
$cred = gcloud auth print-access-token $headers = @{ "Authorization" = "Bearer $cred" } Invoke-WebRequest ` -Method POST ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -InFile request.json ` -Uri "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id /sslCerts" | Select-Object -Expand Content
您应该会收到类似以下内容的 JSON 响应:
响应
{
"kind": "sql#sslCertsInsert",
"operation": {
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id ",
"status": "PENDING",
"user": "user@example.com",
"operationType": "UPDATE",
"name": "operation-id ",
"targetId": "instance-id ",
"selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /operations/operation-id ",
"targetProject": "doc-test-01",
"insertTime": "2020-02-13T00:11:20.677Z"
},
"serverCaCert": {
"kind": "sql#sslCert",
"certSerialNumber": "server-cert-serial-number ",
"cert": "server-cert-value ",
"commonName": "server-cert-name ,
"sha1Fingerprint": "server-cert-sha1Fingerprint ",
"instance": "instance-id ",
"selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id /sslCerts/operation-id ",
"createTime": "2019-11-25T20:12:06.764Z",
"expirationTime": "2029-11-22T20:13:06.764Z"
},
"clientCert": {
"certInfo": {
"kind": "sql#sslCert",
"certSerialNumber": "client-cert-serial-number-2 ",
"cert": "client-cert-value ",
"commonName": "client-cert-name ",
"sha1Fingerprint": "client-cert-sha1Fingerprint-2 ",
"instance": "instance-id ",
"selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id /sslCerts/operation-id ",
"createTime": "2020-02-13T00:10:20.595Z",
"expirationTime": "2030-02-10T00:11:20.595Z"
},
"certPrivateKey": "private-key-value "
}
}
将响应中英文引号内的所有证书内容(不包括英文引号本身)复制到本地文件中,如下所示:将 serverCaCert.cert
复制到 server-ca.pem
。
将 clientCert.cert
复制到 client-cert.pem
。
将 certPrivateKey
复制到 client-key.pem
。
重要提示 :请将此私钥存储在一个安全位置。如果私钥丢失,您必须创建一个新的客户端证书。
在使用任何请求数据之前,请先进行以下替换:
project-id :项目 ID
instance-id :实例 ID
activation-policy :激活政策为 ALWAYS 或 NEVER
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id /restart
请求 JSON 正文:
{
"settings": {
"activationPolicy": "activation-policy "
}
}
如需发送您的请求,请展开以下选项之一:
curl(Linux、macOS 或 Cloud Shell)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
curl -X POST \ -H "Authorization: Bearer "$(gcloud auth print-access-token) \ -H "Content-Type: application/json; charset=utf-8" \ -d @request.json \ "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id /restart"
PowerShell (Windows)
将请求正文保存在名为 request.json
的文件中,然后执行以下命令:
$cred = gcloud auth print-access-token $headers = @{ "Authorization" = "Bearer $cred" } Invoke-WebRequest ` -Method POST ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -InFile request.json ` -Uri "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id /restart" | Select-Object -Expand Content
您应会收到如下所示的 JSON 响应:
{
"kind": "sql#operation",
"targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id ",
"status": "PENDING",
"user": "user@example.com",
"insertTime": "2020-01-20T21:30:35.667Z",
"operationType": "RESTART",
"name": "operation-id ",
"targetId": "instance-id ",
"selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /operations/operation-id ",
"targetProject": "project-id "
}
此时,您会获得如下结果:
另存为 server-ca.pem
的服务器证书。
另存为 client-cert.pem
的客户端公钥证书。
另存为 client-key.pem
的客户端私钥。
根据您在建立连接时所使用工具的不同,这三个项目的指定方式也会有所不同。例如,使用 MySQL 客户端建立连接时,这三个文件分别是 --ssl-ca
、--ssl-cert
和 --ssl-key
命令选项的值。有关使用 MySQL 客户端和 SSL/TLS 的示例连接,请参阅使用 MySQL 客户端连接 。
后续步骤