【问题标题】:How to use the go-mysql-driver with ssl on aws with a mysql rds instance如何在带有 mysql rds 实例的 aws 上使用带有 ssl 的 go-mysql-driver
【发布时间】:2023-03-27 13:13:01
【问题描述】:

我有一个在 AWS 上运行的 RDS 实例,我想知道如何通过 ssl 连接到该实例。

从此链接Using SSL with mysql database。 AWS 设置我们的数据库,并使用证书注册并提供根证书以供下载。 AWS rds root ca

现在 go-mysql-driver 在文档中提供此信息以设置 ssl 连接。

rootCertPool := x509.NewCertPool()
pem, err := ioutil.ReadFile("/path/ca-cert.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@tcp(localhost:3306)/test?tls=custom")

该示例表明我需要一个客户端证书和客户端密钥。

但亚马逊只提供根证书。如何使用 go-mysql-driver 连接到我的 mysql 实例?

【问题讨论】:

    标签: mysql amazon-web-services ssl go


    【解决方案1】:

    我会在上一个答案中添加评论,但我的声誉还不够高。这对我有用:

        rootCertPool := x509.NewCertPool()
        pem, err := ioutil.ReadFile("/path/ca-cert.pem")
        if err != nil {
           log.Fatal(err)
        }
        if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
           log.Fatal("Failed to append PEM.")
        }
        mysql.RegisterTLSConfig("custom", &tls.Config{
                                 ServerName: "qcaurora.cb556lynvxio.us-east-1.rds.amazonaws.com",
                                 RootCAs: rootCertPool,
                                })
        db, err := sql.Open("mysql", "user:pass@tcp(qcrds.example.com:3306)/databasename?tls=custom")
    

    与上面的唯一变化是添加了 ServerName 字段。我还阐明了用于 CNAME dns 条目和密码的地址字段。如果您不对 RDS 使用 CNAME,则可以省略 ServerName 字段。

    我正在使用带有 go-sql-driver/mysql 版本 v1.4.1 的 go 1.11。

    【讨论】:

      【解决方案2】:

      通过查看文档hereherehere,您似乎只需将RootCAs 值设置为您从AWS 获得的根证书。您不需要设置 Certificates 值,因为您没有使用客户端证书。所以代码看起来像:

      rootCertPool := x509.NewCertPool()
      pem, err := ioutil.ReadFile("/path/ca-cert.pem")
      if err != nil {
         log.Fatal(err)
      }
      if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
         log.Fatal("Failed to append PEM.")
      }
      mysql.RegisterTLSConfig("custom", &tls.Config{
                               RootCAs: rootCertPool,
                              })
      db, err := sql.Open("mysql", "user@tcp(localhost:3306)/test?tls=custom")
      

      【讨论】:

      • 这似乎有效,但是当我对我的 mysql 数据库运行查询时。我收到以下错误。 [mysql] 2017/02/11 14:23:14 packet.go:33: 意外 EOF [mysql] 2017/02/11 14:23:15 packet.go:33: 意外 EOF [mysql] 2017/02/11 14:23:15 statement.go:27: 无效连接 所以看起来连接实际上不起作用。关于如何让它发挥作用的任何其他想法?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 2020-04-28
      • 2021-04-02
      • 2011-06-09
      • 2015-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多