Configurar certificados SSL/TLS

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

En esta página se describe cómo configurar una instancia para usar SSL/TLS. También puedes obtener más información sobre cómo Cloud SQL usa certificados SSL/TLS autoadministrados para conectarse de forma segura a las instancias de Cloud SQL.

Descripción general

Cloud SQL crea un certificado de servidor (server-ca.pem) automáticamente cuando se crea la instancia. Te recomendamos aplicar todas las conexiones para que usen SSL/TLS.

Para validar la identidad del cliente o servidor con certificados SSL/TLS, debes crear un certificado de cliente y descargar los certificados en tu máquina anfitrión de cliente MySQL.

Debes reiniciar una instancia después de aplicar SSL para la instancia. Sin embargo, no es necesario reiniciar la instancia después de cambiar los certificados SSL/TLS. Si es necesario reiniciar, esto se hace de forma automática durante el evento de actualización de SSL.

Aplica la encriptación SSL/TLS

Cuando configuras la instancia de Cloud SQL para que acepte conexiones SSL/TLS, se habilitan las conexiones SSL/TLS en ella, pero se siguen aceptando conexiones inseguras y no encriptadas. Si no necesitas SSL/TLS para todas las conexiones, los clientes que no tienen un certificado válido pueden conectarse. Por este motivo, si accedes a la instancia mediante una IP pública, se recomienda que apliques certificados SSL para todas las conexiones.

Cuando la opción que requiere SSL/TLS está habilitada, puedes usar el proxy de autenticación de Cloud SQL o los certificados SSL/TLS para conectarte a tu instancia de Cloud SQL. Usar el proxy de autenticación de Cloud SQL no requiere certificados SSL/TLS porque la conexión está encriptada, sin importar el parámetro de configuración.

Para habilitar el uso obligatorio de SSL/TLS, sigue estos pasos:

Console

  1. En Google Cloud Console, ve a la página Instancias de Cloud SQL.

    Ir a Instancias de Cloud SQL

  2. Para abrir la página de Descripción general de una instancia, haz clic en su nombre.
  3. Haz clic en Conexiones en el Menú de navegación de SQL.
  4. Selecciona la pestaña Seguridad.
  5. Haz clic en Solo permitir conexiones SSL.

gcloud

gcloud sql instances patch INSTANCE_NAME
--require-ssl
  

Terraform

Para aplicar la encriptación SSL/TLS, usa un recurso de Terraform:

resource "google_sql_database_instance" "mysql_instance" {
  name             = "mysql-instance"
  region           = "asia-northeast1"
  database_version = "MYSQL_8_0"
  settings {
    tier              = "db-f1-micro"
    ip_configuration {
      require_ssl = "true"
    }
  }
  deletion_protection = false # set to true to prevent destruction of the resource
}

Aplique los cambios

Para aplicar tu configuración de Terraform en un proyecto de Google Cloud, completa los siguientes pasos:

  1. Inicia Cloud Shell
  2. Establece el proyecto de Google Cloud en el que deseas aplicar la configuración de Terraform:
    export GOOGLE_CLOUD_PROJECT=PROJECT_ID
    
  3. Crea un directorio y abre un archivo nuevo en ese directorio. El nombre del archivo debe tener la extensión .tf, por ejemplo main.tf:
    mkdir DIRECTORY && cd DIRECTORY && nano main.tf
    
  4. Copia la muestra en main.tf.
  5. Revisa y modifica los parámetros de muestra que se aplicarán a tu entorno.
  6. Para guardar los cambios, presiona Ctrl-x y, luego, y.
  7. Inicializa Terraform mediante este comando:
    terraform init
  8. Revisa la configuración y verifica que los recursos que creará o actualizará Terraform coincidan con tus expectativas:
    terraform plan

    Corrige la configuración según sea necesario.

  9. Para aplicar la configuración de Terraform, ejecuta el siguiente comando y, luego, ingresa yes cuando se te solicite:
    terraform apply

    Espera hasta que Terraform muestre el mensaje “Apply complete!”.

  10. Abre tu proyecto de Google Cloud para ver los resultados. En la consola de Google Cloud, navega a tus recursos en la IU para asegurarte de que Terraform los haya creado o actualizado.

Borra los cambios

Para borrar tus cambios, haz lo siguiente:

  1. Para inhabilitar la protección contra la eliminación, en tu archivo de configuración de Terraform, establece el argumento deletion_protection en false.
    deletion_protection =  "false"
  2. Para aplicar la configuración actualizada de Terraform, ejecuta el siguiente comando y, luego, ingresa yes cuando se te solicite:
    terraform apply
  1. Quita los recursos que se aplicaron antes con tu configuración de Terraform mediante la ejecución del siguiente comando y, luego, ingresa yes cuando se te solicite:

    terraform destroy

REST v1

  1. Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

    • project-id: El ID del proyecto
    • instance-id: El ID de la instancia

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, expande una de estas opciones:

    Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

REST v1beta4

  1. Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

    • project-id: El ID del proyecto
    • instance-id: El ID de la instancia

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, expande una de estas opciones:

    Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

Certificados de servidor

Cloud SQL crea un certificado de servidor automáticamente cuando se crea la instancia. Siempre que el certificado del servidor sea válido, no es necesario que lo administres de forma activa. Sin embargo, el certificado tiene una fecha de vencimiento de 10 años. Después de esa fecha, ya no será válido, y los clientes no podrán establecer una conexión segura a la instancia mediante ese certificado. Se te notificará de forma periódica que el certificado del servidor está por vencer. Las notificaciones se envían la siguiente cantidad de días antes de la fecha de vencimiento: 90, 30, 10, 2 y 1.

Puedes obtener información sobre tu certificado de servidor, como la fecha de creación y su vencimiento, o crear uno nuevo de forma manual.

Console

  1. En Google Cloud Console, ve a la página Instancias de Cloud SQL.

    Ir a Instancias de Cloud SQL

  2. Para abrir la página de Descripción general de una instancia, haz clic en su nombre.
  3. Haz clic en Conexiones en el Menú de navegación de SQL.
  4. Selecciona la pestaña Seguridad.
  5. Desplázate hacia abajo hasta la sección Administrar certificados de servidor.

    Puedes ver la fecha de vencimiento de tu certificado de servidor en la tabla.

gcloud

  1. Obtén información sobre el certificado de servicio:
    gcloud beta sql ssl server-ca-certs list \
    --instance=INSTANCE_NAME
    
  2. Crea un certificado de servidor:
    gcloud beta sql ssl server-ca-certs create \
    --instance=INSTANCE_NAME
    
  3. Descarga la información del certificado a un archivo PEM local:
    gcloud beta sql ssl server-ca-certs list \
    --format="value(cert)" \
    --instance=INSTANCE_NAME > \
    FILE_PATH/FILE_NAME.pem
    
  4. Actualiza todos los clientes a fin de usar la información nueva. Para ello, copia el archivo descargado en las máquinas anfitrionas de cliente y reemplaza los archivos server-ca.pem existentes.

Terraform

Para proporcionar información del certificado del servidor como resultado, usa una fuente de datos de Terraform:

  1. Agrega lo siguiente al archivo de configuración de 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
       }
       
  2. Para crear el archivo server-ca.pem, ejecuta el siguiente comando:
       terraform output db_latest_ca_cert > server-ca.pem
       

Certificados de clientes

Crea un nuevo certificado de cliente

Puedes crear hasta 10 certificados de cliente por instancia. Para crear certificados de cliente, debes tener la función de IAM Cloud SQL Admin.

A continuación, se indican algunos aspectos importantes que debes conocer sobre los certificados de cliente:

  • Si pierdes la clave privada de un certificado, debes crear una nueva; la clave privada no se puede recuperar.
  • De forma predeterminada, el certificado de cliente tiene una fecha de vencimiento de 10 años.
  • No recibes notificaciones cuando los certificados de cliente se están acercando al vencimiento.

Console

  1. En Google Cloud Console, ve a la página Instancias de Cloud SQL.

    Ir a Instancias de Cloud SQL

  2. Para abrir la página de Descripción general de una instancia, haz clic en su nombre.
  3. Haz clic en Conexiones en el Menú de navegación de SQL.
  4. Selecciona la pestaña Seguridad.
  5. Haz clic en Crear certificado de cliente.
  6. En el cuadro de diálogo Crear un certificado de cliente, agrega un nombre único.
  7. Haz clic en Crear.
  8. En la primera sección del cuadro de diálogo Certificado SSL nuevo, haz clic en Descargar client-key.pem para descargar la clave privada en un archivo llamado client-key.pem.
  9. En la segunda sección, haz clic en Descargar client-cert.pem para descargar el certificado de cliente en un archivo llamado client-cert.pem.
  10. En la tercera sección, haz clic en Descargar server-ca.pem para descargar el certificado de servidor en un archivo llamado server-ca.pem.
  11. Haz clic en Cerrar.

gcloud

  1. Crea un certificado de cliente mediante el comando ssl client-certs create:

    gcloud sql ssl client-certs create CERT_NAME client-key.pem \
    --instance=INSTANCE_NAME
    
  2. Recupera la clave pública del certificado que acabas de crear y cópiala en el archivo client-cert.pem con el comando ssl client-certs describe:

    gcloud sql ssl client-certs describe CERT_NAME \
    --instance=INSTANCE_NAME \
    --format="value(cert)" > client-cert.pem
    
  3. Copia el certificado de servidor en el archivo server-ca.pem con el comando instances describe:

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

Terraform

Para crear un certificado de cliente, usa un recurso de Terraform:

resource "google_sql_ssl_cert" "mysql_client_cert" {
  common_name = "mysql_common_name"
  instance    = google_sql_database_instance.mysql_instance.name
}

REST v1

  1. Crea un certificado SSL/TLS y asígnale un nombre único para esta instancia:

    Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

    • project-id: El ID del proyecto
    • instance-id: El ID de la instancia
    • client-cert-name: El nombre del certificado de cliente

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

    {
      "commonName" : "client-cert-name"
    }
    

    Para enviar tu solicitud, expande una de estas opciones:

    Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

  2. Copia todo el contenido del certificado que está entre comillas en la respuesta (pero no copies las comillas) en los archivos locales, como se indica a continuación:
    1. Copia serverCaCert.cert en server-ca.pem.
    2. Copia clientCert.cert en client-cert.pem.
    3. Copia certPrivateKey en client-key.pem.
  3. Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

    • project-id: El ID del proyecto
    • instance-id: El ID de la instancia
    • activation-policy: La política de activación es ALWAYS o NEVER.

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, expande una de estas opciones:

    Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

    {
      "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. Crea un certificado SSL/TLS y asígnale un nombre único para esta instancia:

    Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

    • project-id: El ID del proyecto
    • instance-id: El ID de la instancia
    • client-cert-name: El nombre del certificado de cliente

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

    {
      "commonName" : "client-cert-name"
    }
    

    Para enviar tu solicitud, expande una de estas opciones:

    Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

  2. Copia todo el contenido del certificado que está entre comillas en la respuesta (pero no copies las comillas) en los archivos locales, como se indica a continuación:
    1. Copia serverCaCert.cert en server-ca.pem.
    2. Copia clientCert.cert en client-cert.pem.
    3. Copia certPrivateKey en client-key.pem.
  3. Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

    • project-id: El ID del proyecto
    • instance-id: El ID de la instancia
    • activation-policy: La política de activación es ALWAYS o NEVER.

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, expande una de estas opciones:

    Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

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

En este punto tendrás los siguientes elementos:

  • Un certificado de servidor guardado como server-ca.pem
  • Un certificado de clave pública de cliente guardado como client-cert.pem
  • Una clave privada de cliente guardada como client-key.pem

Según la herramienta que uses para conectarte, estos tres elementos tendrán especificaciones diferentes. Por ejemplo, cuando te conectas con el cliente MySQL, estos tres archivos son los valores para las opciones de comando --ssl-ca, --ssl-cert y --ssl-key, respectivamente. Si deseas ver un ejemplo de conexión mediante el cliente MySQL y SSL/TLS, consulta Conéctate con un cliente MySQL.

¿Qué sigue?