亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

Go
飲歌長嘯 2022-10-04 16:25:02
我正在嘗試使用.crt文件連接到在 Azure 中托管的 mongo 數據庫。我能夠使用命令從我的Linux機器終端成功連接:mongo mongodb://username:[email protected]: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:[email protected]: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:[email protected]: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 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號