启用和配置 TLS
Overview
在本指南中,您可以了解如何使用 TLS 协议保护与 MongoDB 部署的连接。 要将连接配置为使用 TLS,请启用 TLS 选项并在创建客户端时提供证书以进行验证。
本指南包括以下部分:
启用 TLS描述了在连接上启用TLS 的方法
配置证书描述配置 TLS 所需的证书
客户端中的参考证书提供了一个示例,说明如何创建
Config
结构来配置 TLS 选项附加信息提供了本指南中提到的类型和方法的资源和 API 文档链接
提示
要学习;了解有关 TLS 的更多信息,请参阅有关传输层安全性的维基百科条目。
启用 TLS
您可以通过以下方式之一在与 MongoDB 实例的连接上启用 TLS:
在连接字符串中将
tls
选项设置为true
创建
ClientOptions
实例时将空Config
结构传递给SetTLSConfig()
方法
从以下 Connection String和ClientOptions标签页中选择,查看相应的代码示例:
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 文档: