Docs 菜单
Docs 主页
/ / /
Go 驱动程序
/ /

启用和配置 TLS

在此页面上

  • Overview
  • 启用 TLS
  • 配置证书
  • 客户端中的参考证书
  • 例子
  • 更多信息
  • API 文档

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

本指南包括以下部分:

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

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

  • 客户端中的参考证书提供了一个示例,说明如何创建 Config结构来配置 TLS 选项

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

提示

要了解有关 TLS 的更多信息,请参阅维基百科中有关传输层安全的条目。

您可以通过以下方式之一在与 MongoDB 实例的连接上启用 TLS:

  • 在连接字符串中将 tls 选项设置为 true

  • 创建ClientOptions实例时将空Config结构传递给SetTLSConfig()方法

从以下 Connection StringClientOptions标签页中选择,查看相应的代码示例:

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

后退

网络压缩