Go语言 rds(mysql)使用iam auth token访问-“由未知机构签名的证书”

plicqrtu  于 2023-11-14  发布在  Go
关注(0)|答案(1)|浏览(82)

尝试使用基于IAM的令牌连接到rds(mysql)。该角色具有rds-db:connect策略(以及其他策略)。
一个片段显示我如何尝试连接到rds:

cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion("us-west-2"))
if err != nil {
    log.Error("Unable to load credentials: %s", err)
}

db_host := "test1-instance-1.cstuff.us-west-2.rds.amazonaws.com:3306"

authToken, err := auth.BuildAuthToken(
    context.TODO(),
    db_host, // Database Endpoint (With Port)
    "us-west-2", // AWS Region
    "iamuser",   // Database Account
    cfg.Credentials,
)
if err != nil {
    panic("failed to create authentication token: " + err.Error())
}

fmt.Println(authToken)

// Create the MySQL DNS string for the DB connection
// user:password@protocol(endpoint)/dbname?<params>
connectStr := fmt.Sprintf("%s:%s@tcp(%s)/%s?allowCleartextPasswords=true&tls=true",
    "iamuser", authToken, db_host, "db_name",
)

// Use db to perform SQL operations on database
dbdbdb, err := sql.Open("mysql", connectStr)

if err != nil {
    panic(err)
}

err = dbdbdb.Ping()
if err != nil {
    panic(err)
}

字符串
这让我在'.Ping()'处出现恐慌,并显示消息:panic: tls: failed to verify certificate: x509: certificate signed by unknown authority
不知道为什么我看到这个错误。
顺便说一句-我通常在EKS中运行这个应用程序。它输出的令牌有几百个字符长。当我在EC2中运行同一个应用程序时,它可能是100个字符。为什么?
如果我使用它在EKS中打印的令牌并使用它从EC2连接,它就可以工作。
在EC2中生成的相同令牌不起作用。
错误消息是相同的任何方式。

shyt4zoc

shyt4zoc1#

找到了一个指向答案here的路径:
您需要像这样添加TLS位:

func RegisterRDSMysqlCerts(c *http.Client) error {
    resp, err := c.Get("https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem")
    if err != nil {
        return err
    }

    pem, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return err
    }

    rootCertPool := x509.NewCertPool()
    if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
        return err 
    }

    err = mysql.RegisterTLSConfig("rds", &tls.Config{RootCAs: rootCertPool, InsecureSkipVerify: true})
    if err != nil {
        return err
    }
    return nil
}

字符串
将此调用添加到sql.Open之前。

err = RegisterRDSMysqlCerts(http.DefaultClient)
if err != nil {
    panic(err)
}


将DSN中的“tls=true”更改为“tls= rds”。

相关问题