Overview
在本指南中,您可以学习;了解如何使用传输层安全 (TLS)协议来保护与MongoDB 部署的连接。
要使用 TLS 连接到MongoDB 部署,必须执行以下步骤:
在
Mongo::Client
中启用 TLS 连接。指定客户端 TLS 证书。
指定证书颁发机构 (CA) 证书以验证服务器的 TLS 证书。
要学习;了解如何为 TLS 配置MongoDB 部署,请参阅MongoDB Server手册中的 TLS 配置指南。
注意
本页假设您已了解 TLS/SSL 并可访问权限有效证书。 TLS/SSL、PKI(公钥基础设施)证书和 CA 的完整描述超出了本文档的范围。要学习;了解有关 TLS 的更多信息,请参阅传输层安全性的 维基百科条目。
启用 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
。
指定客户端 TLS 证书
Ruby驾驶员提供多个选项,供您使用不同数据或对象类型指定 TLS 证书、密钥和 CA 证书。
TLS 证书
您可以提供以下选项之一来指定 TLS 证书:
选项名称 | 接受的数据/对象类型 | 说明 |
---|---|---|
|
| 用于验证与MongoDB 部署的连接的证书文件路径。 |
|
| 用于验证与MongoDB 部署的连接的证书对象。 |
|
| 包含 PEM 编码证书的字符串,用于验证与MongoDB 部署的连接。 |
TLS 私钥
您可以提供以下选项之一来指定 TLS 私钥:
选项名称 | 接受的数据/对象类型 | 说明 |
---|---|---|
|
| 用于验证与MongoDB 部署的连接的私钥文件路径。 |
|
| 用于验证与MongoDB 部署的连接的私钥对象。 |
|
| 私钥的密码。 |
|
| 包含用于验证与MongoDB 部署的连接的 PEM 编码私钥的字符串。 |
TLS CA 证书
您可以提供以下选项之一来指定 TLS CA 证书:
选项名称 | 接受的数据/对象类型 | 说明 |
---|---|---|
|
| 包含串联 CA 证书的文件路径,用于验证从MongoDB 部署传递到客户端的证书。 |
|
| 表示 CA 证书的对象大量,用于验证从MongoDB 部署传递到客户端的证书。 |
|
| 包含一个 PEM 编码的 CA 证书的字符串,用于验证从MongoDB 部署传递到客户端的证书。 |
修改 TLS 上下文
如果您的 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 验证
如果服务器提供的证书包含 OCSP 端点 URI,驾驶员默认会向指定端点发出在线证书状态协议 (OCSP)请求,以验证证书的有效性。
要禁用 OCSP 端点检查,请在创建客户端时将 :ssl_verify_ocsp_endpoint
Ruby选项设立为 false
或将 tlsDisableOCSPEndpointCheck
URI 选项设立为 true
。
注意
JRuby 不支持 OCSP 验证
由于 JRuby 未正确公开 OCSP 端点 URI,因此当根本的应用程序在 JRuby 上运行时,驾驶员不会检查 OCSP 端点。
允许不安全的 TLS
启用 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 文档
有关本指南中讨论的任何类型和方法的更多信息,请参阅以下API文档: