微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Go 中使用 TLS 连接 MongoDB

通常我们的数据库都配置为内网访问,但由于业务部署架构的不同,有时也需要通过公网访问 MongoDB 数据库,此时为了防止被端口扫描和脱库,MongoDB 需要配置为 TLS 访问,那在 Go 中应该如何实现呢?

依赖

配置了 TLS 公网访问的 MongoDB 实例
Go 的 MongoDB 驱动 globalsign/mgo

Go 实现代码:

package model

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

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

    dialInfo, err := mgo.ParseURL(dsn)
    if err != nil {
        log.Panic(err)
    }

    // read pemfile data
    pemData, err := ioutil.ReadFile("./pemfile")
    if err != nil {
        log.Panic(err)
    }

    roots := x509.NewCertPool()
    if !roots.AppendCertsFromPEM(pemData) {
        log.Panic(errors.New("failed to parse root certificate"))
    }

    // set tls config
    tlsConfig := &tls.Config{
        RootCAs:            roots,
        InsecureSkipVerify: true,
    }

    // update dialserver with tls Dial
    dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) {
        conn, err := tls.Dial("tcp", addr.String(), tlsConfig)
        if err != nil {
            log.Println(err)
        }
        return conn, err
    }

    session, err := mgo.DialWithInfo(dialInfo)
    if err != nil {
        log.Panic(err.Error())
    }
    // db operation with session
}

通过以上代码,我们就能通过公网连接 tls 的 MongoDB 实例,当连接上后,其数据库的操作和内网连接一致。
http://www.songjiayang.com/posts/mongo-connect-with-tls-in-go

今晚八点 go分享 直播链接:https://ke.qq.com/course/134017

51Reboot golang课程 6.15开班

有想要咨询的WeChat:17812796384

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐