我有一个 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 没有提供使用主机名进行连接的选项。
有谁知道如何解决这个问题吗?
您应该考虑使用 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
Cloud SQL 颁发两种证书:客户端证书和服务器证书。两个证书都是自签名的。
客户端证书用于验证客户端的身份(相互认证)。该证书是自签名的,Cloud SQL 会验证该证书。
如果您编写自己的验证例程,则服务器证书可用于服务器的身份验证 - 对该功能的支持是特定于库的。否则,禁用主机名证书验证。
禁用主机名验证是否存在安全问题?
如果客户端位于 Google Cloud 网络内,则连接是安全的,因为第三方无法安装中间人。您可以控制用于发起连接的 IP 地址。
如果客户端位于 Google Cloud 网络之外,连接就会面临风险。在这种情况下,请使用 Google Cloud SQL 身份验证代理来提供安全的加密连接。
在几乎所有情况下,我建议使用 Google Cloud SQL Auth 代理。