如何使用 SSL 连接到 Google Cloud SQL?

问题描述 投票:0回答:2

我有一个 Google Cloud SQL 实例,我希望后端 API 和数据库之间的连接尽可能安全。我已在实例设置中指定“仅允许 SSL 连接”。我正在使用 Google 生成的 SSL 证书,但是我很难确定如何安全连接。

当我使用以下方式连接时:

return mysql.createPool({
  host: db_host,
  port: 3306,
  user: db_user,
  password: db_password,
  ssl: {
    rejectUnauthorized: false,
    key: clientKey,
    cert: clientCert,
    ca: serverCa,
  },
});

它工作正常,但是使用“rejectUnauthorized: false”显然不安全。

如果我删除“rejectUnauthorized: false”,我会收到错误

'Hostname/IP does not match certificate's altnames: IP: ##.##.##.## is not in the cert's list:'

我似乎需要使用主机名进行连接,但是 Cloud SQL 没有提供使用主机名进行连接的选项。

有谁知道如何解决这个问题吗?

ssl-certificate google-cloud-sql
2个回答
5
投票

您应该考虑使用 Node.js 连接器,因为它将为您处理证书和 mTLS 连接的管理。

以下是如何启动新的

mysql2
连接池。

import mysql from 'mysql2/promise';
import {Connector} from '@google-cloud/cloud-sql-connector';

const connector = new Connector();
const clientOpts = await connector.getOptions({
  instanceConnectionName: 'my-project:region:my-instance',
  ipType: 'PUBLIC',
});
const pool = await mysql.createPool({
  ...clientOpts,
  user: 'my-user',
  password: 'my-password',
  database: 'db-name',
});
const conn = await pool.getConnection();
const [result] = await conn.query( `SELECT NOW();`);
console.table(result); // prints returned time value from server

await pool.end();
connector.close();

更多信息请访问 https://github.com/GoogleCloudPlatform/cloud-sql-nodejs-connector#using-with-mysql


1
投票

Cloud SQL 颁发两种证书:客户端证书和服务器证书。两个证书都是自签名的。

客户端证书用于验证客户端的身份(相互认证)。该证书是自签名的,Cloud SQL 会验证该证书。

如果您编写自己的验证例程,则服务器证书可用于服务器的身份验证 - 对该功能的支持是特定于库的。否则,禁用主机名证书验证。

禁用主机名验证是否存在安全问题?

如果客户端位于 Google Cloud 网络内,则连接是安全的,因为第三方无法安装中间人。您可以控制用于发起连接的 IP 地址。

如果客户端位于 Google Cloud 网络之外,连接就会面临风险。在这种情况下,请使用 Google Cloud SQL 身份验证代理来提供安全的加密连接。

在几乎所有情况下,我建议使用 Google Cloud SQL Auth 代理

© www.soinside.com 2019 - 2024. All rights reserved.