MONGO-GO-DRIVER与SSL结合使用详解

在mongodb3开始,它会强制进行SSL的配置,否则会存在Mongo shell无法连接到mongodb服务器的情况。
我们开发人员为了在本地部署一个开发环境,都会倾向于在本地部署mongodb的服务器端和客户端,这样为了支持SSL,我们也会在本地通过openssl工具形成一个自签证书。由于自签证书的存在也会给基于mongo-go-driver进行golang开发带来一些问题

问题描述

如果我们只是按照官方文档进行基本的开发,我们会发现我们在连接Mongodb服务器时,会出现如下错误:

server selection error: server selection timeout, current topology: { Type: Unknown, Servers: [{ Addr: localhost:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: connection() : connection(localhost:27017[-61]) incomplete read of message header: EOF }, ] }

解决方案

  1. 在启动mongodb服务器时,需要指定–clusterAuthMode x509参数,如下所示:

    mongod --config /usr/local/etc/mongod.conf --sslWeakCertificateValidation --clusterAuthMode x509
    
  2. 具体的参考方案请参考如下代码:

    caFilePath := "/Users/xxx/keys/ca.pem"
    	certificateKeyFilePath := "/Users/xxx/keys/client.pem"
    	uri :=
    	"mongodb://localhost:27017/?tlsCAFile=%s&tlsCertificateKeyFile=%s&sslAllowInvalidCertificates=true&sslAllowInvalidHostnames=true&ssl=true"
    	uri = fmt.Sprintf(uri, caFilePath, certificateKeyFilePath)
    	credential := options.Credential{
    		AuthMechanism: "MONGODB-X509",
    	}
    	clientOpts := options.Client().ApplyURI(uri).SetAuth(credential)
    
    	client, err := mongo.Connect(context.TODO(), clientOpts)
    	if err != nil {
    		log.Fatal(err)
    	}
    	client.Ping(context.TODO(), nil)
    	log.Println("connect successfully.")
    

    这样,当我们运行如上代码时,会显示如下信息,代表我们成功的连接 到了Mongodb服务器上:
    连接成功

    参数说明
    caFilePath:根证书
    certificateKeyFilePath:客户端认证证书

发布了6 篇原创文章 · 获赞 6 · 访问量 597

猜你喜欢

转载自blog.csdn.net/qq_20996551/article/details/105295306