文档菜单
文档首页
/ / /
Go 驱动程序
/ /

启用和配置TLS

本页内容

  • 概述
  • 启用TLS
  • 配置证书
  • 在客户端中引用证书
  • 示例
  • 更多信息
  • API文档

在本指南中,您可以了解如何使用TLS协议来保护您与MongoDB部署的连接。要配置您的连接以使用TLS,请启用TLS选项,并在创建客户端时提供证书以进行验证。

本指南包括以下部分

  • 启用TLS描述了在连接上启用TLS的方法

  • 配置证书描述了配置TLS所需的证书

  • 在客户端中引用证书提供了一个创建配置TLS选项的Config结构的示例

  • 更多信息提供了有关本指南中提到的类型和方法的资源链接和API文档

提示

您可以通过以下方式之一在连接到您的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/tlscrypto/x509包。接下来,创建一个Config结构实例并设置配置的相关结构字段。

在您的Config实例中,您可以设置可选字段以配置连接上的TLS。对于测试目的,您可以设置InsecureSkipVerify字段为true

警告

InsecureSkipVerify字段设置为true将禁用证书和主机名验证。

在生产环境中指定此选项会使您的应用程序不安全,并可能容易受到过期证书和冒充有效客户端实例的外部进程的攻击。

要了解更多关于Config结构体的信息,请参阅tls.Config API文档。

此示例执行以下操作以创建一个启用了TLS的Config实例和一个Client实例

  1. 创建变量以引用证书文件路径

  2. 使用x509.NewCertPool()方法创建CA文件池,并追加CA文件的内容

  3. 使用tls.LoadX509KeyPair()方法加载客户端证书文件

  4. 实例化一个Config结构体,并设置RootCAsCertificates字段

  5. Config实例传递给SetTLSConfig()方法,以设置ClientOptionsTLSConfig字段

// 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 文档

返回

网络压缩