Go语言如何使用.crt证书通过SSL连接Azure上的MongoDB数据库
问题原因
- 你使用的
github.com/globalsign/mgo驱动属于旧版mgo的第三方分支,已停止维护,其对SCRAM-SHA-256认证机制的支持依赖SASL扩展,默认编译未开启该特性,因此指定Mechanism = "SCRAM-SHA-256"时会抛出SASL未启用的错误。 - 未指定认证机制时,驱动默认使用老旧的SCRAM-SHA-1或MONGODB-CR认证方式,与你Azure MongoDB实例要求的SCRAM-SHA-256不匹配,直接返回认证失败。
- 额外注意:你当前的连接串未指定
authSource参数,Azure托管MongoDB默认的认证源为admin库,缺失该参数也可能导致认证失败。
解决方案
推荐方案:更换为MongoDB官方Go驱动
官方驱动原生支持SCRAM-SHA-256,无需额外编译标签,维护迭代更稳定,适配所有新版MongoDB特性。
示例代码如下:
package main import ( "context" "crypto/tls" "crypto/x509" "io/ioutil" "log" "time" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) func InitMongo() error { // 加载CA证书 rootCerts := x509.NewCertPool() ca, err := ioutil.ReadFile("./rootca.crt") if err != nil { log.Fatalf("读取CA证书失败: %s", err.Error()) return err } success := rootCerts.AppendCertsFromPEM(ca) if !success { log.Fatal("解析CA证书失败") } // 配置TLS tlsConfig := &tls.Config{ RootCAs: rootCerts, InsecureSkipVerify: true, // 对应连接参数--tlsAllowInvalidCertificates } // 构造连接串,新增authSource=admin指定认证源 connStr := "mongodb://username:password@prod-replicaset-0.com:27017,prod-replicaset-1.com:27017,prod-replicaset-2.com:27017/?authSource=admin&ssl=true" // 配置客户端参数 ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() client, err := mongo.Connect(ctx, options.Client(). ApplyURI(connStr). SetTLSConfig(tlsConfig), ) if err != nil { log.Fatalf("创建数据库会话失败: %s", err.Error()) return err } // 测试连接连通性 if err := client.Ping(ctx, nil); err != nil { log.Fatalf("连接数据库失败: %s", err.Error()) return err } log.Printf("连接成功,客户端实例:%v", client) return nil }
执行时直接正常编译运行即可,无需额外标签。
临时方案:继续使用现有globalsign/mgo驱动
如果暂时无法更换驱动,可在编译/运行时添加sasl标签开启SASL支持:
- 运行时:
go run -tags sasl main.go - 构建时:
go build -tags sasl
同时需要做两处代码修改:
- 取消代码中
dbDialInfo.Mechanism = "SCRAM-SHA-256"的注释 - 在连接串中新增
authSource=admin参数,修改后连接串为:mongodb://username:password@prod-replicaset-0.com:27017,prod-replicaset-1.com:27017,prod-replicaset-2.com:27017/?ssl=true&authSource=admin
内容的提问来源于stack exchange,提问作者KIRAN KUMAR B
相关产品推荐
相关产品推荐

