【问题标题】:How do you create a TLS connection to a Cloud SQL database using Go?如何使用 Go 创建与 Cloud SQL 数据库的 TLS 连接?
【发布时间】:2018-12-14 19:40:06
【问题描述】:

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

【问题讨论】:

    标签: mysql ssl go google-cloud-platform google-cloud-sql


    【解决方案1】:

    我缺少的关键是我使用的 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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多