启用和配置TLS
概述
在本指南中,您可以了解如何使用TLS协议来保护您与MongoDB部署的连接。要配置您的连接以使用TLS,请启用TLS选项,并在创建客户端时提供证书以进行验证。
本指南包括以下部分
启用TLS描述了在连接上启用TLS的方法
配置证书描述了配置TLS所需的证书
在客户端中引用证书提供了一个创建配置TLS选项的
Config
结构的示例更多信息提供了有关本指南中提到的类型和方法的资源链接和API文档
提示
要了解更多关于TLS的信息,请参阅维基百科上的《传输层安全》条目传输层安全。
启用TLS
您可以通过以下方式之一在连接到您的MongoDB实例时启用TLS
将连接字符串中的
tls
选项设置为true
在创建
ClientOptions
实例时,向SetTLSConfig()
方法传递一个空的Config
结构
选择以下选项之一连接字符串和客户端选项选项卡,以查看相应的代码示例
uri := "mongodb://<hostname>:<port>?tls=true" opts := options.Client().ApplyURI(uri) client, _ := mongo.Connect(context.TODO(), opts)
uri := "<connection string>" opts := options.Client().ApplyURI(uri).SetTLSConfig(&tls.Config{}) client, _ := mongo.Connect(context.TODO(), opts)
注意
如果您的连接字符串通过包含mongodb+srv
前缀来使用DNS SRV记录,则默认启用您的连接的TLS。
有关客户端选项的完整列表,请参阅连接选项.
配置证书
要成功发起TLS请求,您的应用程序必须提供加密证书以证明其身份。您的应用程序的证书必须存储为PEM文件,以便在连接时启用TLS。
重要
在生产环境中,我们建议您的MongoDB部署使用由同一证书颁发机构生成和签发的有效证书。在测试中,您的部署可以使用自签名证书。
以下列表描述了客户端必须提供以建立启用TLS连接的组件
TLS组件 | 描述 |
---|---|
证书颁发机构(CA) | 在建立TLS连接时信任的一个或多个证书颁发机构。 |
客户端证书 | 一个数字证书,允许服务器验证您的应用程序的身份以建立加密的网络连接。 |
证书密钥 | 客户端证书的私钥文件。此密钥通常包含在证书文件中。 |
密码短语 | 如果私钥加密,则用于解密私钥的密码。 |
客户端中的参考证书
您必须在您的ClientOptions
对象中引用您的证书,以便服务器在客户端连接之前验证它们。我们建议您将ClientOptions
实例的TLSConfig
字段设置为Config
结构,以配置您的TLS连接。Config
结构是Go的本地结构,允许您将所有TLS选项保存在单个可重用对象中。
要创建一个Config
实例,导入crypto/tls
和crypto/x509
包。接下来,创建一个Config
结构实例并设置配置的相关结构字段。
在您的Config
实例中,您可以设置可选字段以配置连接上的TLS。对于测试目的,您可以设置InsecureSkipVerify
字段为true
。
警告
将InsecureSkipVerify
字段设置为true
将禁用证书和主机名验证。
在生产环境中指定此选项会使您的应用程序不安全,并可能容易受到过期证书和冒充有效客户端实例的外部进程的攻击。
要了解更多关于Config
结构体的信息,请参阅tls.Config API文档。
示例
此示例执行以下操作以创建一个启用了TLS的Config
实例和一个Client
实例
创建变量以引用证书文件路径
使用
x509.NewCertPool()
方法创建CA文件池,并追加CA文件的内容使用
tls.LoadX509KeyPair()
方法加载客户端证书文件实例化一个
Config
结构体,并设置RootCAs
和Certificates
字段将
Config
实例传递给SetTLSConfig()
方法,以设置ClientOptions
的TLSConfig
字段
// Enable TLS on a connection by using the Go driver package main import ( "context" "crypto/tls" "crypto/x509" "os" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) func main() { caFile := "<path to CA certificate>" certFile := "<path to public client certificate>" keyFile := "<path to private client key>" // Loads CA certificate file 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") } // Loads client certificate files cert, err := tls.LoadX509KeyPair(certFile, keyFile) if err != nil { panic(err) } // Instantiates a Config instance tlsConfig := &tls.Config{ RootCAs: caCertPool, Certificates: []tls.Certificate{cert}, } uri := "<connection string>" // Sets TLS options in options instance opts := options.Client().ApplyURI(uri).SetTLSConfig(tlsConfig) // Connects to MongoDB with TLS enabled client, err := mongo.Connect(context.TODO(), opts) if err != nil { panic(err) } defer func() { if err = client.Disconnect(context.TODO()); err != nil { panic(err) } }() }
更多信息
要了解如何在连接上启用TLS的更多信息,请参阅以下服务器手册文档
API 文档
要了解本指南中提到的方法和类型,请参阅以下 API 文档