我正在尝试将 go 客户端连接到启用 ssl 运行的 mongodb 服务器。我收到一条明确的错误消息,表明握手由于 ssl 错误而失败。我在客户端使用自签名证书。
从mongodb服务器获取如下:
2017-05-13T04:38:53.910+0000 I NETWORK [thread1] connection accepted from 172.17.0.1:51944 #10 (1 connection now open)
2017-05-13T04:38:53.911+0000 E NETWORK [conn10] SSL: error:14094412:SSL routines:SSL3_READ_BYTES:sslv3 alert bad certificate
2017-05-13T04:38:53.911+0000 I - [conn10] end connection
来自 Go 客户端的错误:
Could not connect to mongodb_s1.dev:27017 x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "XYZ")
尝试了多种选择,但没有帮助
最佳答案
您可以使用 InsecureSkipVerify = true
跳过 TLS 安全检查。这允许您使用自签名证书。请参阅 compose help 中的代码以下。
与其跳过安全检查,不如将用于签署证书的 CA 添加到系统的受信任 CA 列表中。
package main
import (
"crypto/tls"
"fmt"
"net"
"os"
"strings"
"gopkg.in/mgo.v2"
)
func main() {
uri := os.Getenv("MONGODB_URL")
if uri == "" {
fmt.Println("No connection string provided - set MONGODB_URL")
os.Exit(1)
}
uri = strings.TrimSuffix(uri, "?ssl=true")
这里:
tlsConfig := &tls.Config{}
tlsConfig.InsecureSkipVerify = true
dialInfo, err := mgo.ParseURL(uri)
if err != nil {
fmt.Println("Failed to parse URI: ", err)
os.Exit(1)
}
在这里:
dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) {
conn, err := tls.Dial("tcp", addr.String(), tlsConfig)
return conn, err
}
session, err := mgo.DialWithInfo(dialInfo)
if err != nil {
fmt.Println("Failed to connect: ", err)
os.Exit(1)
}
defer session.Close()
dbnames, err := session.DB("").CollectionNames()
if err != nil {
fmt.Println("Couldn't query for collections names: ", err)
os.Exit(1)
}
fmt.Println(dbnames)
}
关于mongodb - golang 客户端无法连接到 mongo 数据库服务器 - sslv3 警报错误证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43949263/