golang客户端无法连接到mongo db服务器-sslv 3警报错误证书

qltillow  于 5个月前  发布在  Go
关注(0)|答案(2)|浏览(68)

我尝试将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")


尝试了多种选择,但没有帮助

u7up0aaq

u7up0aaq1#

您可以使用InsecureSkipVerify = true跳过TLS安全检查。这允许您使用自签名证书。请参阅下面的撰写帮助中的代码。
建议不要跳过安全检查,而是将用于签署证书的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)

}

t40tm48m

t40tm48m2#

如果您使用的是Official MongoDB Go client,则可以通过设置mongo.Connect(context.TODO(), opts)选项来使用自定义CA:

caCert, err := os.ReadFile(caFile)
    if err != nil {
        panic(err)
    }
    caCertPool := x509.NewCertPool()
    if ok := caCertPool.AppendCertsFromPEM(caCert); !ok {
        panic("Error: CA file must be in PEM format")
    }
    // Instantiates a Config instance
    tlsConfig := &tls.Config{
        RootCAs: caCertPool,
    }
    opts := options.Client().ApplyURI(uri).SetTLSConfig(tlsConfig)

字符串
您也可以跳过验证,

serverAPI := options.ServerAPI(options.ServerAPIVersion1)
    opts := options.Client().ApplyURI(uri).SetServerAPIOptions(serverAPI)
    opts.TLSConfig.InsecureSkipVerify = true


测试时跳过验证有时是合理的,但应避免。

相关问题