如何在 Go 中使用 TLS 連接 MongoDB


如何在 Go 中使用 TLS 連接 MongoDB


通常我們的數據庫都配置為內網訪問,但由於業務部署架構的不同,有時也需要通過公網訪問 MongoDB 數據庫,此時為了防止被端口掃描和脫庫,MongoDB 需要配置為 TLS 訪問,那在 Go 中應該如何實現呢?

依賴

  • 配置了 TLS 公網訪問的 MongoDB 實例
  • Go 的 MongoDB 驅動 globalsign/mgo

Go 實現代碼:

package model

import (
\t"crypto/tls"
\t"crypto/x509"
\t"errors"
\t"github.com/globalsign/mgo"
\t"io/ioutil"
\t"log"
\t"net"
)

func main() {
\tdsn := "mongodb://user:password@host/database"

\tdialInfo, err := mgo.ParseURL(dsn)
\tif err != nil {
\t\tlog.Panic(err)
\t}

\t// read pemfile data
\tpemData, err := ioutil.ReadFile("./pemfile")
\tif err != nil {
\t\tlog.Panic(err)
\t}

\troots := x509.NewCertPool()
\tif !roots.AppendCertsFromPEM(pemData) {
\t\tlog.Panic(errors.New("failed to parse root certificate"))
\t}

\t// set tls config
\ttlsConfig := &tls.Config{
\t\tRootCAs: roots,
\t\tInsecureSkipVerify: true,
\t}

\t// update dialserver with tls Dial
\tdialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) {
\t\tconn, err := tls.Dial("tcp", addr.String(), tlsConfig)
\t\tif err != nil {
\t\t\tlog.Println(err)
\t\t}
\t\treturn conn, err
\t}

\tsession, err := mgo.DialWithInfo(dialInfo)
\tif err != nil {
\t\tlog.Panic(err.Error())
\t}
\t// db operation with session
}

通過以上代碼,我們就能通過公網連接 tls 的 MongoDB 實例,當連接上後,其數據庫的操作和內網連接一致。


分享到:


相關文章: