gpt4 book ai didi

mysql - 如何使用 Go 创建到 Cloud SQL 数据库的 TLS 连接?

转载 作者:IT王子 更新时间:2023-10-29 00:57:22 25 4
gpt4 key购买 nike

我正在尝试创建与 Cloud SQL 数据库的 TLS 连接,但在尝试准备语句时出现以下错误:

x509: cannot validate certificate for <cloud sql instance ip>
because it doesn't contain any IP SANs

这是我的设置代码:

rootCertPool := x509.NewCertPool()

pem, err := ioutil.ReadFile("/path/server-ca.pem")
if err != nil {
log.Fatal(err)
}

if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
log.Fatal("Failed to append PEM.")
}

clientCert := make([]tls.Certificate, 0, 1)
certs, err := tls.LoadX509KeyPair("/path/client-cert.pem",
"/path/client-key.pem")
if err != nil {
log.Fatal(err)
}

clientCert = append(clientCert, certs)
mysql.RegisterTLSConfig("custom", &tls.Config{
RootCAs: rootCertPool,
Certificates: clientCert,
})

db, err := sql.Open("mysql",
"<user>:<password>@tcp(<cloud sql ip>:3306)/<db_name>?tls=custom")

最佳答案

我遗漏的关键是我使用的 Go 版本已有几个月的历史,并且不包含特定的修复程序,而且我没有指定与我的 Cloud SQL 实例关联的主机名。我无法在任何地方找到这个问题的答案,而是通过单步执行 TLS 握手代码来查看出了什么问题以及原因,从而自己找到了解决方案。

2018 年 9 月之前发布的 Go 版本无法正确验证 Cloud SQL 在 TLS 服务器证书中使用的主机名。 Cloud SQL 主机名包含“:”字符,这导致主机名和服务器证书被视为无效。已修复。

使用 TLS 连接到 Cloud SQL 实例的正确方法是遵循以下步骤:

  1. 更新您的 Go,以便进行更改以验证服务器证书中的 Cloud SQL 主机名。

  2. 使用 Cloud SQL 控制台创建客户端证书。

  3. 按如下方式创建 TLS 连接:

import (
"crypto/tls"
"crypto/x509"
"database/sql"
"github.com/go-sql-driver/mysql"
"io/ioutil"
)

rootCertPool := x509.NewCertPool()

pem, err := ioutil.ReadFile("/path/server-ca.pem")
if err != nil {
log.Fatal(err)
}

if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
log.Fatal("Failed to append PEM.")
}

clientCert := make([]tls.Certificate, 0, 1)
certs, err := tls.LoadX509KeyPair("/path/client-cert.pem",
"/path/client-key.pem")
if err != nil {
log.Fatal(err)
}

clientCert = append(clientCert, certs)
mysql.RegisterTLSConfig("custom", &tls.Config{
RootCAs: rootCertPool,
Certificates: clientCert,
ServerName: "<gcp-project-id>:<cloud-sql-instance>", // hostname
})

db, err := sql.Open("mysql",
"<user>:<password>@tcp(<cloud sql ip>:3306)/<db_name>?tls=custom")

关于mysql - 如何使用 Go 创建到 Cloud SQL 数据库的 TLS 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53752383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com