Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 通过ssl将golang mgo连接到mongo_Mongodb_Ssl_Go_Tls1.2_Compose - Fatal编程技术网

Mongodb 通过ssl将golang mgo连接到mongo

Mongodb 通过ssl将golang mgo连接到mongo,mongodb,ssl,go,tls1.2,compose,Mongodb,Ssl,Go,Tls1.2,Compose,我正在尝试在本地设置mongo,以测试中描述的设置 “稍微难一点”部分 Mongo 我有一组自签名凭据和mongo设置。 我已经包括了密钥,因为这些密钥只在开发过程中使用,以确保mongo ssl代码正常工作 使用此选项时,请通过 mongod --config config/location 配置是 net: port: 27017 ssl: mode: requireSSL CAFile: /data/mongo/ca.crt PEMKeyFile: /

我正在尝试在本地设置mongo,以测试中描述的设置

“稍微难一点”部分

Mongo

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

使用此选项时,请通过

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变量

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配置

您将什么作为
ca
参数传递到
NewSession
?这需要是PEM编码的CA证书字节,而不是CA证书的文件名
AppendCertsFromPEM
将返回
true
,如果它成功地将任何证书添加到池中

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

if ca, err := ioutil.ReadFile("myPEM"); err == nil { 
    roots.AppendCertsFromPEM(ca)
}
SSL错误表示客户端拒绝服务器证书。我怀疑这是因为您的自签名证书没有正确添加到池中

编辑

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

docker run --rm -ti -v $(pwd):/data/mongo --net=host mongo -f /data/mongo/mongo.yaml
从提取配置的位置运行时

根据我下面的评论,在Go中使用
NewSession
func显示
tls.Dial
由于缺少任何主题访问名(SAN)扩展名而返回错误

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

您可以调试以下情况下发生的此TLS连接错误和任何其他TLS连接错误:

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
}

我特别地传递了一些格式的东西------开始证书-----------结束证书------避免传递文件名,而只是通过env或suchIt设置的ca字符串似乎至少为函数获取了正确的值。是否验证
AppendCertsFromPEM
是否返回
true
。另外,重新阅读您的帖子,您的mongo连接正在使用客户端证书。您想只接受经过身份验证的客户端吗?如果是这样,需要将客户端证书添加到
tlsConfig
AppendCertsFromPEM返回true,只是稍微更新了mongo配置,已经删除了客户端证书验证。它最初试图验证客户端证书,但后来删除了(据我所知,无法在compose中配置)。