使用go中的ssl和certs连接到mysql/mariadb

在Go语言中连接需要证书验证的MySQL或MariaDB数据库时,需要创建`tls.Config`,加载证书,并通过`mysql.RegisterTLSConfig`注册配置。连接字符串需包含`?tls=custom`来指定使用自定义的TLS配置。
摘要由CSDN通过智能技术生成

mysql go ssl mariadb client-certificates

在只需要用户名和密码的情况下,有许多示例说明如何使用go/golang连接到mariadb/mysql数据库。但是我还没有找到一个简单的例子,客户机需要证书(TLS/SSL)来连接。

这适用于普通连接

package main

import (
    "database/sql"
    "fmt"
    "log"

    _ "github.com/go-sql-driver/mysql"
) 

// Test that db is usable
// prints current date & time to stdout
func queryDB(db *sql.DB) {
    // Query the database
    var result string
    err := db.QueryRow("SELECT NOW()").Scan(&result)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(result)
}

func main() {
    // generate connection string
    cs := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", "username", "password", "dbHost", "dbPort", "database")
    db, err := sql.Open("mysql", cs)
    if err != nil {
        log.Printf("Error %s when opening DB\n", err)
        log.Printf("%s", cs)
        return
    }
    defer db.Close()
    e := db.Ping()
    fmt.Println(cs, e)
    queryDB(db)
}

但是如果客户需要证书来连接,我应该把这些信息放在哪里?

在我的my.cnf中是这样的:

[mysql]
## MySQL Client Configuration ##
ssl-ca=cert/ca-cert.pem
ssl-cert=cert/client-cert.pem
ssl-key=cert/client-key.pem

发布于 1 年前

回答

正在上传…重新上传取消

为了能够使用证书进行身份验证,您必须创建一个tls.Config,然后执行mysql.RegisterTLSConfig("custom", &tlsConf),并将"?tsl=custom"添加到连接字符串中。

其中tls来自"crypto/tls"mysql来自"github.com/go-sql-driver/mysql"

一个有效的例子:

package main

import (
    "crypto/tls"
    "crypto/x509"
    "database/sql"
    "fmt"
    "io/ioutil"
    "log"

    "github.com/go-sql-driver/mysql"
    _ "github.com/go-sql-driver/mysql"
)


// path to cert-files hard coded
// Most of this is copy pasted from the internet
// and used without much reflection
func createTLSConf() tls.Config {

    rootCertPool := x509.NewCertPool()
    pem, err := ioutil.ReadFile("cert/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("cert/client-cert.pem", "cert/client-key.pem")
    if err != nil {
        log.Fatal(err)
    }

    clientCert = append(clientCert, certs)

    return tls.Config{
        RootCAs:            rootCertPool,
        Certificates:       clientCert,
        InsecureSkipVerify: true, // needed for self signed certs
    }
}


// Test that db is usable
// prints version to stdout
func queryDB(db *sql.DB) {
    // Query the database
    var result string
    err := db.QueryRow("SELECT NOW()").Scan(&result)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(result)
}

func main() {

    // When I realized that the tls/ssl/cert thing was handled separately
    // it became easier, the following two lines are the important bit
    tlsConf := createTLSConf()  
    err := mysql.RegisterTLSConfig("custom", &tlsConf)

    if err != nil {
        log.Printf("Error %s when RegisterTLSConfig\n", err)
        return
    }

    // connection string (dataSourceName) is slightly different
    dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?tls=custom", "username", "password", "dbHost", "dbPort", "database")
    db1, err := sql.Open("mysql", dsn)

    if err != nil {
        log.Printf("Error %s when opening DB\n", err)
        log.Printf("%s", dsn)
        return
    }
    defer db1.Close()
    e := db1.Ping()
    fmt.Println(dsn, e)
    queryDB(db1)
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用可以通过将/etc/ssl/private/ssl-cert-snakeoil.key复制到/etc/ssl/certs/目录,并设置相应的权限,来确保该文件可读。另外,/etc/ssl/certs/ssl-cert-snakeoil.pem文件应该已经是可读的。此外,如果您遇到了github的服务器证书验证失败的问题,可以尝试重新安装证书或更新证书。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Robot_Commander:CordovaAndroid应用程序可控制ROS机器人](https://download.csdn.net/download/weixin_42131439/18656333)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【linux】CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none 解决方法](https://blog.csdn.net/xinhuarufang/article/details/112653990)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [服务器证书验证失败。 CAfile:/etc/ssl/certs/ca-certificates.crt CRLfile:无](https://blog.csdn.net/xfxf996/article/details/107954491)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值