如何使用go创建到云sql数据库的tls连接?

kiayqfof  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(383)

我正在尝试创建到云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")
ndh0cuux

ndh0cuux1#

我缺少的关键是,我使用的go版本已经有几个月了,没有包含特定的修复程序,而且我没有指定与我的cloudsql示例关联的主机名。我在任何地方都找不到这个问题的答案,于是我自己通过tls握手代码来找到解决方案,看看哪里出了问题,为什么出了问题。
2018年9月之前发布的go版本无法正确验证云sql在tls服务器证书中使用的主机名。云sql主机名包含“:”字符,导致主机名和服务器证书被视为无效。已经修好了。
使用tls连接到云sql示例的正确方法是遵循以下步骤:
更新您的go,以便您拥有允许验证服务器证书中的云sql主机名的更改。
使用云sql控制台创建客户端证书。
按如下方式创建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")

相关问题