通过 ssl 将 golang mgo 连接到 mongo
Connecting golang mgo to mongo via ssl
我正在尝试在本地设置 mongo 以测试
中描述的设置
https://www.compose.com/articles/connect-to-mongo-3-2-on-compose-from-golang/
"A Little Harder"节
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 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 配置
您要将什么作为 ca
参数传递给 NewSession
?这需要是 PEM 编码的 CA 证书字节,而不是 CA 证书的文件名。 AppendCertsFromPEM
将 return 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
是 returning 一个错误,因为根据我在下面的评论缺少任何主题访问名称 (SAN) 扩展.
您需要更正您的服务器证书以具有所需的适当主机名(或 IP 地址)SAN 条目。
您可以调试此问题以及出现的任何其他 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
}
我正在尝试在本地设置 mongo 以测试
中描述的设置https://www.compose.com/articles/connect-to-mongo-3-2-on-compose-from-golang/ "A Little Harder"节
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 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 配置
您要将什么作为 ca
参数传递给 NewSession
?这需要是 PEM 编码的 CA 证书字节,而不是 CA 证书的文件名。 AppendCertsFromPEM
将 return 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
是 returning 一个错误,因为根据我在下面的评论缺少任何主题访问名称 (SAN) 扩展.
您需要更正您的服务器证书以具有所需的适当主机名(或 IP 地址)SAN 条目。
您可以调试此问题以及出现的任何其他 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
}