为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
饮歌长啸 2022-10-04 16:25:02
我正在尝试使用.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 mainimport (    "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”,如果它需要使用任何其他库,那对我来说完全没问题。我只想连接到数据库。
查看完整描述

1 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

经过大量的研究,我无法找到一种方法来使用.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

}


查看完整回答
反对 回复 2022-10-04
  • 1 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信