配置 SSL/TLS 证书

本页面介绍了如何将实例配置为使用 SSL/TLS。详细了解如何将 SSL/TLS 与 Cloud SQL 搭配使用

概览

当您创建实例时,Cloud SQL 会自动创建一个服务器证书 (server-ca.pem)。

要使用 SSL/TLS,您需要创建一个客户端证书并将证书下载到 MySQL 客户端主机。

如果您计划使用 SSL/TLS 进行连接,我们建议您对所有连接强制使用 SSL/TLS。

更改 SSL/TLS 证书后,您无需重启实例。如果重启是必要操作,则系统会在 SSL 更新事件发生时自动完成此操作。

要求使用 SSL/TLS

启用要求使用 SSL/TLS 选项后,您可以使用 Cloud SQL 身份验证代理或 SSL/TLS 证书连接到 Cloud SQL 实例。使用 Cloud SQL 身份验证代理不需要 SSL/TLS 证书,因为无论设置如何,连接都已加密。如果不要求使用 SSL/TLS,则没有有效证书的客户端可以连接。

如需启用要求使用 SSL/TLS,请执行以下操作:

控制台

  1. 在 Google Cloud Console 中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 点击实例名称,打开其概览页面。
  3. 点击 SQL 导航菜单中的连接
  4. 选择安全标签页。
  5. 点击只允许 SSL 连接

gcloud

gcloud sql instances patch INSTANCE_NAME
--require-ssl
  

REST v1

  1. 在使用任何请求数据之前,请先进行以下替换:

    • project-id:项目 ID
    • instance-id:实例 ID

    HTTP 方法和网址:

    PATCH https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id

    请求 JSON 正文:

    {
      "settings": {
        "ipConfiguration": {"requireSsl": "true"}
      }
    }
    

    如需发送您的请求,请展开以下选项之一:

    您应该会收到类似以下内容的 JSON 响应:

REST v1beta4

  1. 在使用任何请求数据之前,请先进行以下替换:

    • 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"}
      }
    }
    

    如需发送您的请求,请展开以下选项之一:

    您应该会收到类似以下内容的 JSON 响应:

服务器证书

当您创建实例时,Cloud SQL 会自动创建一个服务器证书。只要此服务器证书有效,您就无需主动管理服务器证书。但是,服务器证书是有失效日期的(即 10 年);此日期过后,该证书就不再有效,客户端也无法再使用该证书与您的实例之间建立安全连接。 系统会定期通知您服务器证书即将到期。通知在失效日期前的以下天数发送:90、30、10、2 和 1。

您可以获取服务器证书的相关信息,例如该证书的创建时间和到期时间。您也可以手动创建一个新证书。

控制台

  1. 在 Google Cloud Console 中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 点击实例名称,打开其概览页面。
  3. 点击 SQL 导航菜单中的连接
  4. 选择安全标签页。
  5. 向下滚动到管理服务器证书部分。

    您可以在表中查看服务器证书的失效日期。

gcloud

  1. 获取有关服务证书的信息:
    gcloud beta sql ssl server-ca-certs list \
    --instance=INSTANCE_NAME
    
  2. 创建服务器证书:
    gcloud beta sql ssl server-ca-certs create \
    --instance=INSTANCE_NAME
    
  3. 将证书信息下载到本地 PEM 文件中:
    gcloud beta sql ssl server-ca-certs list \
    --format="value(cert)" \
    --instance=INSTANCE_NAME > \
    FILE_PATH/FILE_NAME.pem
    
  4. 通过将下载的文件复制到客户端主机上并替换现有的 server-ca.pem 文件,将所有客户端更新为使用新信息。

客户端证书

新建客户端证书

您最多可为每个实例创建 10 个客户端证书。如果您丢失了证书的私钥,则必须新建一个新密钥,私钥无法恢复。 默认情况下,客户端证书的有效期为 10 年。当客户端证书即将到期时,您不会收到通知。

控制台

  1. 在 Google Cloud Console 中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 点击实例名称,打开其概览页面。
  3. 点击 SQL 导航菜单中的连接
  4. 选择安全标签页。
  5. 点击创建客户端证书
  6. 创建客户端证书对话框中,添加一个唯一名称。
  7. 点击创建
  8. 已创建新的 SSL 证书对话框的第一部分,点击下载 client-key.pem,将私钥下载到名为 client-key.pem 的文件中。
  9. 在第二部分,点击下载 client-cert.pem,将客户端证书下载到名为 client-cert.pem 的文件中。
  10. 在第三部分,点击下载 server-ca.pem,将服务器证书下载到名为 server-ca.pem 的文件中。
  11. 点击关闭

gcloud

  1. 使用 ssl client-certs create 命令创建客户端证书:

    gcloud sql ssl client-certs create CERT_NAME client-key.pem \
    --instance=INSTANCE_NAME
    
  2. 使用 ssl client-certs describe 命令检索您刚刚创建的证书的公钥,并将其复制到 client-cert.pem 文件中:

    gcloud sql ssl client-certs describe CERT_NAME \
    --instance=INSTANCE_NAME \
    --format="value(cert)" > client-cert.pem
    
  3. 使用 instances describe 命令将服务器证书复制到 server-ca.pem 文件:

    gcloud sql instances describe INSTANCE_NAME \
    --format="value(serverCaCert.cert)" > server-ca.pem
    
  4. gcloud sql instances restart INSTANCE_NAME
    

REST v1

  1. 创建一个 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"
    }
    

    如需发送您的请求,请展开以下选项之一:

    您应该会收到类似以下内容的 JSON 响应:

  2. 将响应中英文引号内的所有证书内容(不包括英文引号本身)复制到本地文件中,如下所示:
    1. serverCaCert.cert 复制到 server-ca.pem
    2. clientCert.cert 复制到 client-cert.pem
    3. certPrivateKey 复制到 client-key.pem
  3. 在使用任何请求数据之前,请先进行以下替换:

    • project-id:项目 ID
    • instance-id:实例 ID
    • activation-policy:激活政策为 ALWAYSNEVER

    HTTP 方法和网址:

    POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/restart

    请求 JSON 正文:

    {
      "settings": {
        "activationPolicy": "activation-policy"
      }
    }
    

    如需发送您的请求,请展开以下选项之一:

    您应该收到类似以下内容的 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

  1. 创建一个 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"
    }
    

    如需发送您的请求,请展开以下选项之一:

    您应该会收到类似以下内容的 JSON 响应:

  2. 将响应中英文引号内的所有证书内容(不包括英文引号本身)复制到本地文件中,如下所示:
    1. serverCaCert.cert 复制到 server-ca.pem
    2. clientCert.cert 复制到 client-cert.pem
    3. certPrivateKey 复制到 client-key.pem
  3. 在使用任何请求数据之前,请先进行以下替换:

    • project-id:项目 ID
    • instance-id:实例 ID
    • activation-policy:激活政策为 ALWAYSNEVER

    HTTP 方法和网址:

    POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/restart

    请求 JSON 正文:

    {
      "settings": {
        "activationPolicy": "activation-policy"
      }
    }
    

    如需发送您的请求,请展开以下选项之一:

    您应会收到如下所示的 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 客户端连接

后续步骤