我正在尝试在本地设置Mongo以测试https://www.compose.com/articles/connect-to-mongo-3-2-on-compose-from-golang/中“有点难”部分所描述的设置。
Mongo
我有一套可工作的自签名凭据和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秒的超时。在session顶部的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配置
AppendCertsFromPEM
是否返回了true
吗?另外,重新阅读了你的帖子,你的 mongo 连接正在使用客户端证书。你是否只想接受经过身份验证的客户端?如果是这样,需要将客户端证书添加到tlsConfig
中。 - Martin CampbellServerName
。此外,你没有任何服务器证书扩展,因此证书可能因为这个原因被拒绝。在DialServer
函数内拨号后,err
是否包含任何错误? - Martin Campbell