如何在具有mysql RDS实例的AWS上将ssl使用go-mysql-driver

Jon*_*itz 5 mysql ssl go amazon-web-services

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

从此链接将SSL与mysql数据库一起使用。AWS设置我们的数据库,该数据库已注册了证书并提供了根证书供下载。 AWS RDS根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")
Run Code Online (Sandbox Code Playgroud)

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

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

fis*_*ell 6

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

    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")
Run Code Online (Sandbox Code Playgroud)

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

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


Mar*_*k B 4

通过查看此处此处此处的文档,您似乎只需将该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")
Run Code Online (Sandbox Code Playgroud)