通过ssl将golang mgo连接到mongo

时间:2017-07-27 08:16:05

标签: mongodb ssl go tls1.2 compose

我尝试在本地设置mongo以测试

中描述的设置

https://www.compose.com/articles/connect-to-mongo-3-2-on-compose-from-golang/ " A Hardrder"节

蒙戈

我有一组有效的自签名凭据和mongo设置。 我已经包含了密钥,因为这些只会在开发期间使用,以确保mongo ssl代码正常工作。

mongo ssl config

使用时,通过

运行
mongod --config config/location

配置

net:
  port: 27017
  ssl:
    mode: requireSSL
    CAFile: /data/mongo/ca.crt
    PEMKeyFile: /data/mongo/server.pem
    allowInvalidHostnames: true
    allowConnectionsWithoutCertificates: true

然后我可以使用

连接到数据库
mongo --ssl --sslCAFile /data/mongo/ca.crt

Golang

func NewSession(url string, ca string) (m *mgo.Session, err error) {
    roots := x509.NewCertPool()
    roots.AppendCertsFromPEM([]byte(ca))

    tlsConfig := &tls.Config{}
    tlsConfig.RootCAs = roots

    url = strings.TrimSuffix(url, "?ssl=true")
    dialInfo, err := mgo.ParseURL(url)
    dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) {
        conn, err := tls.Dial("tcp", addr.String(), tlsConfig)
        return conn, err
    }

    //Here it is the session. Up to you from here ;)
    session, err := mgo.DialWithInfo(dialInfo)
    if err != nil {
        return m, err
    }

    session.SetMode(mgo.Monotonic, true)

    return session, nil
}

结果

Golang的东西尝试连接并命中10秒超时。会话顶部的fmt显示正确的文件正在进入ca var。

Mongo日志显示

utumongo_1         | 2017-07-27T08:09:14.964+0000 I NETWORK  [initandlisten] connection accepted from 172.19.0.4:57474 #30 (1 connection now open)
utumongo_1         | 2017-07-27T08:09:14.966+0000 E NETWORK  [conn30] SSL: error:14094412:SSL routines:SSL3_READ_BYTES:sslv3 alert bad certificate
utumongo_1         | 2017-07-27T08:09:14.967+0000 I NETWORK  [conn30] end connection 172.19.0.4:57474 (0 connections now open)

修改 更新了mongo config

1 个答案:

答案 0 :(得分:3)

您将NewSession作为ca参数传递给AppendCertsFromPEM?这需要是PEM编码的CA证书字节,而不是CA证书的文件名。如果true设法将任何证书添加到池中,则if ca, err := ioutil.ReadFile("myPEM"); err == nil { roots.AppendCertsFromPEM(ca) } 将返回docker run --rm -ti -v $(pwd):/data/mongo --net=host mongo -f /data/mongo/mongo.yaml

该文章已经显示了执行此操作的代码:

NewSession

SSL错误表示客户端拒绝服务器证书。我怀疑这是因为您的自签名证书未正确添加到池中。

修改

我在您的配置中本地运行了一份mongo副本。使用docker,这是:

tls.Dial

从提取配置的地方开始

在Go中使用您的dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) { conn, err := tls.Dial("tcp", addr.String(), tlsConfig) if err != nil { fmt.Println(err) } return conn, err } func表明button.addEventListener("click", function (event) { event.preventDefault(); if (navigator.userAgent.match(/ipad|ipod|iphone/i)) { var $input = $('#input_output'); $input.val(); var el = $input.get(0); var editable = el.contentEditable; var readOnly = el.readOnly; el.contentEditable = true; el.readOnly = false; var range = document.createRange(); range.selectNodeContents(el); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); el.setSelectionRange(0, 999999); el.contentEditable = editable; el.readOnly = readOnly; var successful = document.execCommand('copy'); $input.blur(); var msg = successful ? 'successful ' : 'un-successful '; } else{ var copyTextarea = document.querySelector('#input_output'); copyTextarea.select(); var successful = document.execCommand('copy'); var msg = successful ? 'successful ' : 'unsuccessful'; } 由于缺少任何主题访问名称(SAN)扩展而返回错误,如下面的评论所示。

您需要更正服务器证书,以获得所需的适当主机名(或IP地址)SAN条目。

您可以使用以下命令调试此错误和任何其他TLS连接错误:

{{1}}