如何在Go中使用.crt文件通过 SSL连接到蒙古德

我正在尝试使用.crt文件连接到在 Azure 中托管的 mongo 数据库。


我能够使用命令从我的Linux机器终端成功连接:


mongo mongodb://username:password@prod-replicaset-0.com:27017,prod-replicaset-1.com:27017,prod-replicaset-2.com:27017/ --tls --tlsCAFile rootca.crt --tlsAllowInvalidCertificates

我还能够通过设置“使用SSL协议”并使用身份验证机制作为“SCRAM-SHA-256”从mongo UI客户端(如robo3T)进行连接。[如果我将身份验证机制设置为任何其他值,则会导致身份验证失败]


但是我无法在Go lang代码中连接到该数据库。


以下是我正在使用的代码示例:


package main


import (

    "crypto/tls"

    "crypto/x509"

    "io/ioutil"

    "log"

    "net"


    "github.com/globalsign/mgo"

)


func InitMongo() error {


    rootCerts := x509.NewCertPool()

    ca, err := ioutil.ReadFile("./rootca.crt")

    if err != nil {

        log.Fatalf("failed to read file : %s", err.Error())

        return err

    }


    success := rootCerts.AppendCertsFromPEM(ca)

    if !success {

        log.Printf("rootcert failed")

    }


    connStr := "mongodb://username:password@prod-replicaset-0.com:27017,prod-replicaset-1.com:27017,prod-replicaset-2.com:27017/?ssl=true"


    dbDialInfo, err := mgo.ParseURL(connStr)

    if err != nil {

        log.Fatal("unable to parse url - " + err.Error())

    }


    dbDialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) {

        return tls.Dial("tcp", addr.String(), &tls.Config{

            RootCAs:            rootCerts,

            InsecureSkipVerify: true,

        })

    }


    // dbDialInfo.Mechanism = "SCRAM-SHA-256"


    _session, err := mgo.DialWithInfo(dbDialInfo)

    if err != nil {

        log.Fatalf("failed to creating db session : %s", err.Error())

        return err

    }


    log.Printf("Created session - %v", _session)


    return nil

}

当我运行此代码时,我收到错误:无法创建数据库会话:“服务器在 SASL 身份验证步骤中返回错误:身份验证失败。


如果我在创建会话之前设置了 [数据库拨号信息机制 = “SCRAM-SHA-256”],则出现错误:无法创建数据库会话:“在构建期间未启用 SASL 支持(-标记 sasl)”


请让我知道导致此问题的原因,我如何连接到数据库。目前我正在使用“github.com/globalsign/mgo”,如果它需要使用任何其他库,那对我来说完全没问题。我只想连接到数据库。

饮歌长啸
浏览 112回答 1
1回答

慕盖茨4494581

经过大量的研究,我无法找到一种方法来使用.crt文件连接到mongodb,使用全局签名库。但是,我成功地使用mongo驱动程序库来做到这一点。此处的连接字符串可以是格式:mongodb://user:password@replicaset-0.com:27017,replicaset-1.com:27017,replicaset-2.com:27017/?ssl=true&tlsCAFile=./ca.crt&tlsCertificateKeyFile=./ca.pem&authSource=admin&replicaSet=replicaset示例代码:import (    "context"    "log"    "os"    // "github.com/globalsign/mgo"    mgo "go.mongodb.org/mongo-driver/mongo"    mongoOptions "go.mongodb.org/mongo-driver/mongo/options")func InitMongo() (error) {        connStr := os.Getenv("MONGODB_CONN_STR")    dbName := os.Getenv("MONGODB_DATABASE")    clientOpts := mongoOptions.Client().ApplyURI(connStr)    if err := clientOpts.Validate(); err != nil {        log.Print("unable to parse url")        log.Fatal(err)    }    client, err := mgo.Connect(context.TODO(), clientOpts)    if err != nil {        log.Print("unable to connect into database")        log.Fatal(err)    }    if err := client.Ping(context.TODO(), nil); err != nil {        log.Print("database ping failed")        log.Fatal(err)    }    //client.Database(dbName)    return nil}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go