Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs 菜单
Docs 主页
/ / /
Ruby 驱动程序
/

配置传输层安全 (TLS)

在本指南中,您可以学习;了解如何使用传输层安全 (TLS)协议来保护与MongoDB 部署的连接。

要使用 TLS 连接到MongoDB 部署,必须执行以下步骤:

  • Mongo::Client 中启用 TLS 连接。

  • 指定客户端 TLS 证书。

  • 指定证书颁发机构 (CA) 证书以验证服务器的 TLS 证书。

要学习;了解如何为 TLS 配置MongoDB 部署,请参阅MongoDB Server手册中的 TLS 配置指南。

注意

本页假设您已了解 TLS/SSL 并可访问权限有效证书。 TLS/SSL、PKI(公钥基础设施)证书和 CA 的完整描述超出了本文档的范围。要学习;了解有关 TLS 的更多信息,请参阅传输层安全性的 维基百科条目。

您可以通过以下方式为MongoDB 部署的连接启用TLS:

  • 在新的 Mongo:Client对象中将 ssl 选项设置为 true

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

注意

SSL 命名规则

Ruby驾驶员v2.6 及更高版本支持的所有MongoDB Server版本仅实现TLS。 2.6 并且不使用 SSL。

由于历史原因, Ruby驾驶员在 TLS 选项前加上 ssl 前缀,而不是 tls。Ruby驾驶员版本 3.0 及更高版本将使用 tls 前缀作为Ruby选项名称。

要配置证书,必须指定以下选项:

  • ssl_cert:用于验证与MongoDB 部署的连接的证书文件。

  • ssl_key:用于验证与MongoDB 部署的连接的私钥文件。

  • ssl_ca_cert:包含级联 CA 证书的文件,用于验证从MongoDB 部署传递到客户端的证书。如果没有为此选项指定值,驾驶员将使用默认的系统根证书存储作为信任锚。

在以下示例中,TLS 证书和相应的私钥在单独的文件中提供:

client = Mongo::Client.new(["<hostname>:<port>"],
ssl: true,
ssl_cert: 'path/to/client.crt',
ssl_key: 'path/to/client.key',
ssl_ca_cert: 'path/to/ca.crt'
)

您可以在单个文件中同时指定 TLS 证书和私钥,但仍必须同时指定证书和私钥选项。在以下示例中,TLS 证书和私钥均在同一 client.pem文件中定义:

client = Mongo::Client.new(["<hostname>:<port>"],
ssl: true,
ssl_cert: 'path/to/client.pem',
ssl_key: 'path/to/client.pem',
ssl_ca_cert: 'path/to/ca.crt',
)

要配置证书,必须指定以下 URI 选项:

  • tlsCertificateKeyFile:包含用于验证与MongoDB 部署的连接的证书和密钥文件的文件。

  • tlsCAFile:包含级联 CA 证书的文件,用于验证从MongoDB 部署传递到客户端的证书。如果没有为此选项指定值,驾驶员将使用默认的系统根证书存储作为信任锚。

client = Mongo::Client.new(
"mongodb://<hostname>:<port>/?tls=true&tlsCertificateKeyFile=path%2fto%2fclient.pem&tlsCAFile=path%2fto%2fca.crt")

包含证书和密钥的文件通常具有``.crt`` 或 .pem 扩展名。

URI 选项值必须是百分比编码的。示例,这适用于路径中的斜杠 (/),其编码为 %2f

Ruby驾驶员提供多个选项,供您使用不同数据或对象类型指定 TLS 证书、密钥和 CA 证书。

您可以提供以下选项之一来指定 TLS 证书:

选项名称
接受的数据/对象类型
说明

:ssl_cert

String

用于验证与MongoDB 部署的连接的证书文件路径。

:ssl_cert_object

OpenSSL::X509::Certificate

用于验证与MongoDB 部署的连接的证书对象。

:ssl_cert_string

String

包含 PEM 编码证书的字符串,用于验证与MongoDB 部署的连接。

您可以提供以下选项之一来指定 TLS 私钥:

选项名称
接受的数据/对象类型
说明

:ssl_key

String

用于验证与MongoDB 部署的连接的私钥文件路径。

:ssl_key_object

OpenSSL::PKey

用于验证与MongoDB 部署的连接的私钥对象。

:ssl_key_pass_phrase

String

私钥的密码。

:ssl_key_string

String

包含用于验证与MongoDB 部署的连接的 PEM 编码私钥的字符串。

您可以提供以下选项之一来指定 TLS CA 证书:

选项名称
接受的数据/对象类型
说明

:ssl_ca_cert

String

包含串联 CA 证书的文件路径,用于验证从MongoDB 部署传递到客户端的证书。

:ssl_ca_cert_object

Array<OpenSSL::X509::Certificate>

表示 CA 证书的对象大量,用于验证从MongoDB 部署传递到客户端的证书。

:ssl_ca_cert_string

String

包含一个 PEM 编码的 CA 证书的字符串,用于验证从MongoDB 部署传递到客户端的证书。

如果您的 TLS 配置需要自定义,则可以通过原生Ruby Proc对象添加到 Mongo.tls_context_hooks大量来设立TLS 上下文钩子。在创建任何 Mongo::Client 实例之前,将 Proc对象添加到大量中。

以下代码示例启用 AES256-SHA 密码作为用于 TLS 的唯一密码:

Mongo.tls_context_hooks.push(
Proc.new { |context|
context.ciphers = ["AES256-SHA"]
}
)

Ruby驾驶员TLS 上下文选项基于 SSL 的原生Ruby处理。要学习;了解有关可用 TLS 上下文选项的更多信息,请参阅 SSLContext 的Ruby文档。

如果服务器提供的证书包含 OCSP 端点 URI,驾驶员默认会向指定端点发出在线证书状态协议 (OCSP)请求,以验证证书的有效性。

要禁用 OCSP 端点检查,请在创建客户端时将 :ssl_verify_ocsp_endpoint Ruby选项设立为 false 或将 tlsDisableOCSPEndpointCheck URI 选项设立为 true

注意

JRuby 不支持 OCSP 验证

由于 JRuby 未正确公开 OCSP 端点 URI,因此当根本的应用程序在 JRuby 上运行时,驾驶员不会检查 OCSP 端点。

启用 TLS 后, Ruby驾驶员会自动验证服务器提供的证书。测试代码时,可以禁用此验证。这称为不安全 TLS

启用不安全 TLS 后,驾驶员仅要求服务器提供 X. 509证书。 即使满足以下任一条件,驾驶员也会接受证书:

  • 服务器的主机名与证书上的主题名称(或主题备用名称)不匹配。

  • 证书过期或无效。

  • 证书链中没有受信任的根证书。

  • 证书用途对服务器标识无效。

注意

即使启用了不安全的 TLS,客户端和服务器之间的通信也会使用 TLS 进行加密。

要启用不安全的 TLS,请将 sslVerify客户端选项或 tlsInsecure URI 选项设立为 true

client = Mongo::Client.new(["<hostname>:<port>"],
ssl: true,
ssl_verify: false
)
client = Mongo::Client.new('mongodb://<hostname>:<port>/?tls=true&tlsInsecure=true')

您可以类似地设立以下选项来禁用证书或主机名验证:

  • ssl_verify_certificate:通过将该选项设置为 false 来禁用证书验证。

  • ssl_verify_hostname:通过将该选项设置为 false 来禁用主机名验证。

  • tlsAllowInvalidCertificates:通过将该选项设置为 true 来禁用证书验证。

  • tlsAllowInvalidHostnames:通过将该选项设置为 true 来禁用主机名验证。

警告

不要在生产中使用不安全的 TLS

在生产中始终禁用不安全的 TLS。

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

有关本指南中讨论的任何类型和方法的更多信息,请参阅以下API文档:

后退

连接选项

在此页面上