Overview
在本指南中,您可以学习;了解在使用Kotlin Sync驾驶员连接到MongoDB时如何使用 TLS 安全协议。
启用 TLS
您可以通过以下方式在与 MongoDB 实例的连接上启用 TLS:
在连接string中设置
tls
参数创建
MongoClientSettings
实例时使用SslSettings.Builder
类中的enabled()
方法
注意
DNS 种子列表协议启用 TLS
如果使用 DNS 种子列表协议(由连接string中的 mongodb+srv
前缀表示)进行连接,则驾驶员会自动启用 TLS。
要学习;了解有关使用 DNS 种子列表时的连接行为的更多信息,请参阅服务器手册中连接字符串指南的SRV 连接格式部分。
要使用连接string在连接上启用TLS,请在选项参数中将 tls
选项设立为 true
并将string传递给 MongoClient.create()
,如以下代码所示:
val mongoClient = MongoClient.create("mongodb+srv://<db_username>:<db_password>@<cluster_url>/?tls=true")
要在MongoClientSettings
实例中启用TLS,请使用applyToSslSettings()
构建器方法。 在SslSettings.Builder
区块中将enabled
属性设置为true
,如以下代码所示:
val settings = MongoClientSettings.builder() .applyConnectionString(ConnectionString("<connection string URI>")) .applyToSslSettings { builder -> builder.enabled(true) } .build() val mongoClient = MongoClient.create(settings)
注意
调试 TLS
如果您在设置 TLS 连接时遇到问题,可以使用 -Djavax.net.debug=all
系统属性来查看有用的日志语句。有关更多信息,请参阅Java语言文档中的调试 SSL/TLS 连接。
配置证书
发起 TLS 请求的Kotlin应用程序需要访问权限加密证书,以证明应用程序的身份并验证与Kotlin应用程序交互的其他应用程序。 您可以通过以下方式在应用程序中配置对这些证书的访问权限:
使用Java虚拟机(JVM)信任存储和Java虚拟机(JVM)密钥存储
使用特定于客户端的信任存储和密钥存储
配置 JVM 信任存储区
注意
默认下,JRE 包含许多来自 Let's Encrypt 等签名机构的常用公共证书。因此,在连接到MongoDB Atlas实例或其证书由 JRE默认证书存储中的颁发机构签名的任何其他服务器时,您可以启用TLS,并且无需配置信任存储即可启用 TLS。
Java虚拟机(JVM)信任存储区保存的证书可安全地标识与您的Kotlin应用程序交互的其他应用程序。 通过使用这些证书,您的应用程序可以证明与另一个应用程序的连接是真实的,并且是安全的,不会被第三方篡改。
如果您的MongoDB实例使用由 JRE默认证书存储中不存在的颁发机构签名的证书,则您的应用程序必须配置以下系统属性才能发起 TLS 请求。
javax.net.ssl.trustStore
:包含客户端 TLS 证书的信任存储区的路径javax.net.ssl.trustStorePassword
:用于访问权限信任存储的密码,这些信任库在javax.net.ssl.trustStore
这些属性确保您的应用程序可以验证连接的MongoDB实例提供的 TLS 证书。
您可以使用 JDK 中的keytool命令行工具创建信任存储,如以下终端命令所示:
keytool -importcert -trustcacerts -file <path to certificate authority file> -keystore <path to trust store> -storepass <password>
配置 JVM 密钥存储库
注意
默认情况下,MongoDB 实例不执行客户端证书验证。如果将 MongoDB 实例配置为验证客户端证书,您必须配置密钥存储。
发起 TLS 请求的应用程序必须设立以下Java虚拟机(JVM)系统属性,以确保客户端向MongoDB服务器提供 TLS 证书:
javax.net.ssl.keyStore
:包含客户端 TLS/SSL 证书的密钥存储区的路径javax.net.ssl.keyStorePassword
:用于访问权限密钥存储的密码,这些密钥库的定义在javax.net.ssl.keyStore
您可以使用keytool或openssl命令行工具创建密钥存储。
要学习;了解有关配置Kotlin应用程序以使用 TLS 的更多信息,请参阅Java语言文档中的JSSE 参考指南。
配置特定于客户端的信任存储和密钥存储
您可以使用SSLContext
类的init()
方法配置客户端特定的信任存储和密钥存储。
在本指南的通过Java SE SSLContext 自定义 TLS 配置部分中,查看演示如何配置客户端以使用SSLContext
示例的实例。
禁用主机名验证
默认,驾驶员确保服务器的 TLS 证书中包含的主机名与构造MongoClient
时提供的主机名匹配。 要为应用程序禁用主机名验证,请在applytoSslSettings()
构建器区块中将构建器的invalidHostNameAllowed
属性设立为true
:
val settings = MongoClientSettings.builder() .applyConnectionString(ConnectionString("<connection string URI>")) .applyToSslSettings { builder -> builder.enabled(true) builder.invalidHostNameAllowed(true) } .build() val mongoClient = MongoClient.create(settings);
警告
禁用主机名验证会使应用程序不安全,并且可能容易受到过期证书和冒充有效客户端实例的外部进程的攻击。
将连接限制为仅使用 TLS 1.2
要将应用程序限制为仅使用 TLS 1.2协议,请将jdk.tls.client.protocols
系统属性设置为"TLSv1.2"
。
注意
Java 8 之前的 Java 运行时环境 (JRE) 仅在更新版本中启用了 TLS 1.2 协议。如果您的 JRE 未启用 TLS 1.2 协议,请升级到更高版本以使用 TLS 1.2 进行连接。
通过Java SE SSLContext 自定义 TLS 配置
如果您的 TLS 配置需要自定义,您可以通过将SSLContext对象传递给 applyToSslSettings()
区块中的 context()
方法构建器设立MongoClient
的 sslContext
属性:
val sslContext = SSLContext.getDefault() val settings = MongoClientSettings.builder() .applyToSslSettings { builder -> builder.enabled(true) builder.context(sslContext) } .build() val mongoClient = MongoClient.create(settings);
有关 SSLContext
类的更多信息,请参阅 SSL 上下文 的API文档。
在线证书状态协议 (OCSP)
OCSP 是用于检查 X. 509证书是否已被撤销的标准。 证书颁发机构可以在到期时间之前将 X. 509证书添加到证书吊销列表 (CRL),以使该证书失效。 当客户端在 TLS 握手期间发送 X. 509证书时,CA 的吊销服务器会检查 CRL 并返回good
、 revoked
或unknown
状态。
该驱动程序支持以下 OCSP 变体:
客户端驱动的 OCSP
OCSP 装订 (Stapling)
以下部分描述了变体之间的差异以及如何为您的应用程序启用这些变体。
注意
Kotlin Sync驾驶员使用为应用程序配置的Java虚拟机(JVM)参数,并且无法针对特定的MongoClient
实例进行覆盖。
客户端驱动的 OCSP
在客户端驱动的 OCSP 中,客户端在收到服务器发送的证书后,将 OCSP 请求中的证书发送给 OCSP 响应程序。OCSP 响应程序通过证书颁发机构 (CA) 检查证书的状态,并在发送给客户端的响应中报告证书是否有效。
要为您的应用程序启用客户端驱动的 OCSP,请设置以下 JVM 系统属性:
属性 | 值 |
---|---|
| 将此属性设置为 |
| 将此属性设置为 |
警告
如果 OCSP 响应程序不可用,JDK 提供的 TLS 支持会报告“硬故障”。这与 MongoDB Shell 和其他一些驱动程序的“软故障”行为不同。
OCSP 装订 (Stapling)
OCSP 装订是一种机制,在该机制中,服务器必须从证书颁发机构 (CA) 获取签名证书,并将其包含在对客户端的带时间戳的 OCSP 响应中。
要为您的应用程序启用 OCSP 装订,请设置以下 JVM 系统属性:
属性 | 说明 |
---|---|
| 将此属性设置为 |
| Set this property to true to enable OCSP stapling.If unset or set to false , the connection can proceed regardless of the presence or status of the certificate revocation response. |
有关 OCSP 的更多信息,请查看以下资源:
有关如何为应用程序启用OCSP 的Oracle JDK8 文档
API 文档
有关本指南中讨论的任何方法或类型的更多信息,请参阅以下API文档: