This page describes how to enforce SSL/TLS encryption for an instance to ensure that all connections are encrypted. You can also learn more about how Cloud SQL uses self-managed SSL/TLS certificates to connect to Cloud SQL instances securely.
Overview
Cloud SQL creates a server certificate automatically when you create your instance. We recommend that you enforce all connections to use SSL/TLS.
SQL Server only performs certificate verification when the client request explicitly specifies that it requires an encrypted connection. In this case the server certificate must be installed on the client machine. Otherwise, clients are able to freely connect with no additional changes to their connection strings or certificates, even if you configure the instance withsslMode
set to ENCRYPTED_ONLY
.
For more information, see the Enable encrypted connections to the Database Engine section in the SQL Server documentation.
If you enforce SSL for an instance, then the instance requires a restart. A restart might also be required after you change SSL/TLS certificates. When a restart is required, Cloud SQL automatically restarts the instance for you. The restart of an instance can incur downtime.Enforce SSL/TLS encryption
You can use the SSL mode setting to enforce SSL encryption in the following ways:
Allow both non-SSL/non-TLS and SSL/TLS connections. This is the default.
Only allow connections encrypted with SSL/TLS.
If you select Allow non-SSL/non-TLS and SSL/TLS connections for your Cloud SQL instance, SSL/TLS connections are accepted, as well as unencrypted and unsecure connections. If you do not require SSL/TLS for all connections, unencrypted connections are still allowed. For this reason, if you are accessing your instance using public IP, we strongly recommend that you enforce SSL for all connections.
You can connect either directly to instances by using SSL/TLS certificates, or you can connect by using the Cloud SQL Auth Proxy or Cloud SQL Connectors. If you connect by using Cloud SQL Auth Proxy or Cloud SQL Connectors, then the connections are automatically encrypted with SSL/TLS. With Cloud SQL Auth Proxy and Cloud SQL Connectors, client and server identities are also automatically verified regardless of the SSL mode setting.
Enforcing SSL ensures that all connections are encrypted.To enable requiring SSL/TLS, do the following:
Console
-
In the Google Cloud console, go to the Cloud SQL Instances page.
- To open the Overview page of an instance, click the instance name.
- Click Connections from the SQL navigation menu.
- Select the Security tab.
- Select one of the following:
- Allow unencrypted network traffic (not recommended)
- Allow only SSL connections. This option only allows connections using SSL/TLS encryption.
gcloud
gcloud sql instances patch INSTANCE_NAME \ --ssl-mode=SSL_ENFORCEMENT_MODE
Replace SSL_ENFORCEMENT_MODE with one of the following options:
ALLOW_UNENCRYPTED_AND_ENCRYPTED
allows non-SSL/non-TLS and SSL/TLS connections. This is the default value.ENCRYPTED_ONLY
only allows connections encrypted with SSL/TLS.
Terraform
To enforce SSL/TLS encryption, use a Terraform resource:
Apply the changes
To apply your Terraform configuration in a Google Cloud project, complete the steps in the following sections.
Prepare Cloud Shell
- Launch Cloud Shell.
-
Set the default Google Cloud project where you want to apply your Terraform configurations.
You only need to run this command once per project, and you can run it in any directory.
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Environment variables are overridden if you set explicit values in the Terraform configuration file.
Prepare the directory
Each Terraform configuration file must have its own directory (also called a root module).
-
In Cloud Shell, create a directory and a new
file within that directory. The filename must have the
.tf
extension—for examplemain.tf
. In this tutorial, the file is referred to asmain.tf
.mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
If you are following a tutorial, you can copy the sample code in each section or step.
Copy the sample code into the newly created
main.tf
.Optionally, copy the code from GitHub. This is recommended when the Terraform snippet is part of an end-to-end solution.
- Review and modify the sample parameters to apply to your environment.
- Save your changes.
-
Initialize Terraform. You only need to do this once per directory.
terraform init
Optionally, to use the latest Google provider version, include the
-upgrade
option:terraform init -upgrade
Apply the changes
-
Review the configuration and verify that the resources that Terraform is going to create or
update match your expectations:
terraform plan
Make corrections to the configuration as necessary.
-
Apply the Terraform configuration by running the following command and entering
yes
at the prompt:terraform apply
Wait until Terraform displays the "Apply complete!" message.
- Open your Google Cloud project to view the results. In the Google Cloud console, navigate to your resources in the UI to make sure that Terraform has created or updated them.
Delete the changes
To delete your changes, do the following:
- To disable deletion protection, in your Terraform configuration file set the
deletion_protection
argument tofalse
.deletion_protection = "false"
- Apply the updated Terraform configuration by running the following command and
entering
yes
at the prompt:terraform apply
-
Remove resources previously applied with your Terraform configuration by running the following command and entering
yes
at the prompt:terraform destroy
REST v1
-
Before using any of the request data, make the following replacements:
- PROJECT_ID: The project ID
- SSL_ENFORCEMENT_MODE: Use one of the following options:
ALLOW_UNENCRYPTED_AND_ENCRYPTED
: allows non-SSL/non-TLS and SSL/TLS connections.ENCRYPTED_ONLY
: only allows connections encrypted with SSL/TLS.
- INSTANCE_ID: The instance ID
HTTP method and URL:
PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID
Request JSON body:
{ "settings": { "ipConfiguration": {"sslMode": "SSL_ENFORCEMENT_MODE"} } }
To send your request, expand one of these options:
You should receive a JSON response similar to the following:
REST v1beta4
-
Before using any of the request data, make the following replacements:
- PROJECT_ID: The project ID
- SSL_ENFORCEMENT_MODE: Use one of the following options:
ALLOW_UNENCRYPTED_AND_ENCRYPTED
: allows non-SSL/non-TLS and SSL/TLS connections.ENCRYPTED_ONLY
: only allows connections encrypted with SSL/TLS.
- INSTANCE_ID: The instance ID
HTTP method and URL:
PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID
Request JSON body:
{ "settings": { "ipConfiguration": {"sslMode": "SSL_ENFORCEMENT_MODE"} } }
To send your request, expand one of these options:
You should receive a JSON response similar to the following:
Server certificates
Cloud SQL creates a server certificate automatically when you create your instance. As long as the server certificate is valid, you don't need to actively manage your server certificate. Cloud SQL lets you select between two different certificate authority (CA) hierarchies. The CA hierarchy that you select becomes the server CA mode of the instance. If you're using per-instance CA as the server CA mode for your instance, then the server certificates have an expiration date of 10 years. If you're using shared CA as the server CA mode of your instance (Preview), then the server certificate has an expiration date of 1 year. After the expiration date, the server certificate is no longer valid, and clients can no longer establish a secure connection to your instance using that certificate. If a client is configured to verify the CA or verify the hostname in the server certificate, then that client's connections to Cloud SQL instances with expired server certificates will fail. To prevent disruption to client connections, rotate the server certificate before the certificate expires. You're periodically notified that the server certificate is nearing expiration. The notifications are sent the following number of days before the expiration date: 90, 30, 10, 2, and 1.
You can get information about your server certificate, such as when it was created, and when it expires. Before the expiration date, you can create a new one manually.
Console
-
In the Google Cloud console, go to the Cloud SQL Instances page.
- To open the Overview page of an instance, click the instance name.
- Click Connections from the SQL navigation menu.
- Select the Security tab.
- Go to the Manage server certificates section.
You can see the expiration date of your server certificate in the table.
gcloud
For instances that use self-signed server certificates (per-instance CA):
- To get information about the server certificate, use the sql ssl server-ca-certs list command:
gcloud sql ssl server-ca-certs list \ --instance=INSTANCE_NAME
- To create a server certificate, use the sql ssl server-ca-certs create command:
gcloud sql ssl server-ca-certs create \ --instance=INSTANCE_NAME
- Download the certificate information to a local PEM file:
gcloud sql ssl server-ca-certs list \ --format="value(cert)" \ --instance=INSTANCE_NAME > \ FILE_PATH/FILE_NAME.pem
- Update all of your clients to use the new information by
copying the downloaded file to your client host machines, replacing the
existing
server-ca.pem
files.
For instances that use server certificates issued by a shared CA (Preview):
- To get information about the server certificate, use the
beta sql ssl server-certs list command:
gcloud beta sql ssl server-certs list \ --instance=INSTANCE_NAME
- To create a server certificate, use the beta sql ssl server-certs create command:
gcloud beta sql ssl server-certs create \ --instance=INSTANCE_NAME
- Download the certificate information to a local PEM file:
gcloud beta sql ssl server-certs list \ --format="value(ca_cert.cert)" \ --instance=INSTANCE_NAME > \ FILE_PATH/FILE_NAME.pem
- Update all of your clients to use the new information by
copying the downloaded file to your client host machines, replacing the
existing
server-ca.pem
files.
Terraform
To provide server certificate information as an output, use a Terraform data source:
- Add the following to your Terraform configuration file:
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 }
- To create the
server-ca.pem
file, run the following command:terraform output db_latest_ca_cert > server-ca.pem
Use encrypted connections
Learn more about how SQL Server uses encrypted connections.
About server identity verification
Server identity verification depends on the server certificate authority (CA) hierarchy configuration of your Cloud SQL instance.
If your instance is configured to use the per-instance CA, verifying the CA also verifies the server identity since each instance has a unique CA.
If your instance is configured to use the shared CA (Preview), then verifying the hostname along with verifying the CA is required for server identity verification since server CAs are shared across instances.
If you have per-instance CA, you can only perform DNS name based server identity verification for Private Service Connect instances.
If you have shared CA (Preview), you can perform DNS name based server identity verification for all types of instances, namely Private Service Connect, private service access, and public IP instances.
You can view which CA hierarchy is configured for a Cloud SQL instance by viewing instance details.
For more information, see View instance information or the following section, Enable server identity verification.
Enable server identity verification
If you select shared CAs as the server CA mode of your Cloud SQL instance (Preview), then we recommend that you also enable server identity verification. Instances that use shared CA as the server CA mode contain the instance DNS name in the Subject Alternative Name (SAN) field of the server certificate. You can get this DNS name by using the instance lookup API and using the response as a hostname for server identity verification. You need to set up DNS resolution for the DNS name.
To enable server identity verification, complete the following steps:
Retrieve the DNS name.
To view summary information about a Cloud SQL instance, including the DNS name of the instance, use the
gcloud sql instances describe
command:gcloud sql instances describe INSTANCE_NAME \ --project=PROJECT_ID
Make the following replacements:
- INSTANCE_NAME: the name of the Cloud SQL instance
- PROJECT_ID: the ID or project number of the Google Cloud project that contains the instance
In the response, verify that the DNS name appears. This name has the following pattern:
INSTANCE_UID.PROJECT_DNS_LABEL.REGION_NAME.sql.goog.
For example:
1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.
Create the DNS record in a DNS zone. If you are connecting privately, then create the DNS record in a private DNS zone in the corresponding Virtual Private Cloud (VPC) network.
When you connect to the Cloud SQL for SQL Server instance, configure the DNS name or IP address as the hostname. Then enable server identity verification by specifying the
-N
flag forsqlcmd
or by selecting the Encrypt Connection/Encryption option of SSMS.Other SQL Server drivers have similar flags or configurations.
What's next
- Manage SSL/TLS certificates on your Cloud SQL instance.
- Learn more about how encryption is handled in Google Cloud.