在连接上启用 TLS/SSL
本页内容
概述
在本指南中,您可以了解如何使用以下方法连接到MongoDB实例:TLS/SSL 安全协议,它使用JDK底层的TLS/SSL支持。要配置您的连接使用TLS/SSL,请在ConnectionString 或 MongoClientSettings. 中启用TLS/SSL设置。
注意
调试TLS/SSL
如果您在设置TLS/SSL连接时遇到问题,可以使用-Djavax.net.debug=all
系统属性来查看更多日志语句。请参阅Oracle关于调试TLS/SSL连接的指南 获取更多信息。
启用 TLS/SSL
您可以通过两种不同的方式为连接到您的MongoDB实例启用TLS/SSL:通过连接字符串中的参数,或使用MongoClientSettings.Builder
类中的方法。
注意
DNS Seedlist协议启用TLS
如果您通过使用DNS seedlist协议(由连接字符串中的mongodb+srv
前缀指示)进行连接,驱动程序会自动启用TLS/SSL。要禁用它,请在连接字符串中将tls
参数值设置为false
,或在创建MongoClientSettings
实例时,在SslSettings.Builder
块中将enabled
属性设置为false
。
有关使用DNS seedlist时连接行为的更多信息,请参阅服务器手册中的SRV连接格式部分。
要在与ConnectionString的连接上启用TLS/SSL,请将连接字符串参数tls
赋值为true
,并将其传递给MongoClient.create()
val mongoClient = MongoClient.create("mongodb+srv://<user>:<password>@<cluster-url>?tls=true")
要使用MongoClientSettings.Builder
类配置MongoClient
的TLS/SSL连接选项,请调用applyToSslSettings()方法。在SslSettings.Builder
块中将enabled
属性设置为true
以启用TLS/SSL
val settings = MongoClientSettings.builder() .applyConnectionString(ConnectionString("<connection string>")) .applyToSslSettings { builder -> builder.enabled(true) } .build() val mongoClient = MongoClient.create(settings)
配置证书
Kotlin应用程序在发起TLS/SSL请求时,需要访问用于证明应用程序本身以及与该应用程序交互的其他应用程序身份的加密证书。您可以使用以下机制在您的应用程序中配置对这些证书的访问:
JVM信任存储和JVM密钥存储
特定客户端的信任存储和密钥存储
注意
以下章节基于Oracle JDK的文档,因此某些部分可能不适用于您的JDK或您使用的自定义TLS/SSL实现。
配置JVM信任存储
注意
默认情况下,JRE包括许多常用的由签名机构(如Let's Encrypt)提供的公共证书。因此,您可以在不配置信任存储的情况下,使用TLS/SSL连接到MongoDB Atlas实例(或任何其他由JRE默认证书存储中签名机构签名的服务器)。
JVM信任存储保存了与您的Kotlin应用程序交互的其他应用程序的安全标识证书。使用这些证书,您的应用程序可以证明与另一个应用程序的连接是真实的且未被第三方篡改。
如果您的MongoDB实例使用的是不在JRE默认证书存储中的签名机构的证书,则您的应用程序必须配置两个系统属性来发起SSL/TLS请求。这些属性确保您的应用程序可以验证连接的MongoDB实例提供的TLS/SSL证书。
javax.net.ssl.trustStore
:包含签名机构证书的信任存储的路径javax.net.ssl.trustStorePassword
:访问在javax.net.ssl.trustStore
中定义的信任存储的密码
您可以使用JDK提供的命令行工具 keytool 创建信任存储库
keytool -importcert -trustcacerts -file <path to certificate authority file> -keystore <path to trust store> -storepass <password>
配置JVM密钥存储
注意
默认情况下,MongoDB实例不会执行客户端证书验证。如果您配置了MongoDB实例以验证客户端证书,则必须配置密钥存储。
JVM密钥存储保存了安全地识别您的Kotlin应用程序的其他应用程序的证书。使用这些证书,其他应用程序可以证明与您应用程序的连接是真实且安全的,不受第三方篡改。
发起TLS/SSL请求的应用程序需要设置两个JVM系统属性,以确保客户端向MongoDB服务器提供TLS/SSL证书
javax.net.ssl.keyStore
:包含客户端TLS/SSL证书的密钥存储的路径javax.net.ssl.keyStorePassword
:访问在javax.net.ssl.keyStore
中定义的密钥存储的密码
您可以使用keytool或openssl命令行工具来创建密钥库。
有关配置Kotlin应用程序使用TLS/SSL的更多信息,请参阅JSSE参考指南。
配置特定客户端的信任库和密钥库
您可以使用SSLContext
类的init()
方法配置客户端特定的信任存储和密钥存储。
有关如何使用SSLContext
实例配置客户端的示例,请参阅本指南中的使用SSLContext自定义TLS/SSL配置部分。
有关SSLContext
类的更多信息,请参阅SSL上下文
禁用主机名验证
默认情况下,驱动程序确保服务器TLS/SSL证书中包含的主机名与构建MongoClient
时提供的主机名相匹配。要禁用应用程序的主机名验证,您可以在applytoSslSettings()
构建lambda中显式禁用此功能,将构建器的invalidHostNameAllowed
属性设置为true
。
val settings = MongoClientSettings.builder() .applyConnectionString(ConnectionString("<connection string>")) .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/SSL 配置
如果您的 TLS/SSL 配置需要自定义,您可以通过传递一个 SSLContext 对象到 applyToSslSettings()
lambda 构造函数中来自定义您的 MongoClient
的 sslContext
属性。
// You can customize SSL settings using the SSLContext val sslContext = SSLContext.getDefault() val settings = MongoClientSettings.builder() .applyToSslSettings { builder -> builder.enabled(true) builder.context(sslContext) } .build() val mongoClient = MongoClient.create(settings);
在线证书状态协议 (OCSP)
OCSP 是一种用于检查 X.509 证书是否被撤销的标准。证书颁发机构可以在证书到期前将其添加到证书撤销列表 (CRL) 中,以使证书失效。当客户端在 TLS 握手过程中发送 X.509 证书时,CA 的撤销服务器会检查 CRL 并返回“良好”、“已撤销”或“未知”的状态。
驱动程序支持以下 OCSP 变体
客户端驱动OCSP
OCSP Stapling
以下部分描述了它们之间的差异以及如何为您的应用程序启用它们。
注意
Kotlin 驱动程序使用为应用程序配置的 JVM 参数,不能为特定的 MongoClient
实例覆盖。
客户端驱动 OCSP
在客户端驱动 OCSP 中,客户端在从服务器接收证书后,将证书以 OCSP 请求的形式发送给 OCSP 响应者。OCSP 响应者通过与证书颁发机构 (CA) 检查证书状态,并在发送给客户端的响应中报告证书是否有效。
要为您的应用程序启用客户端驱动 OCSP,请设置以下 JVM 系统属性
属性 | 值 |
---|---|
com.sun.net.ssl.checkRevocation | 将此属性设置为 true 以启用撤销检查。 |
ocsp.enable | 将此属性设置为 true 以启用客户端驱动 OCSP。 |
警告
如果 OCSP 响应者不可用,JDK 提供的 TLS 支持将报告“硬失败”。这与 MongoDB Shell 和一些其他驱动程序的“软失败”行为不同。
OCSP Stapling
OCSP Stapling是一种机制,其中服务器必须从证书颁发机构(CA)获取签名证书,并将其包含在时间戳OCSP响应中发送给客户端。
要为您的应用程序启用OCSP Stapling,设置以下JVM系统属性
属性 | 描述 |
---|---|
com.sun.net.ssl.checkRevocation | 将此属性设置为 true 以启用撤销检查。 |
jdk.tls.client.enableStatusRequestExtension | 将此属性设置为 true 以启用OCSP Stapling。如果未设置或设置为 false ,连接可以继续,无论证书吊销响应的存在或状态如何。 |
有关OCSP的更多信息,请参阅以下资源
Oracle JDK 8关于如何为应用程序启用OCSP的文档如何为应用程序启用OCSP