在连接上启用 TLS
概述
在本指南中,您可以学习如何使用TLS/SSL 协议,使用.NET框架中底层的TLS/SSL支持。要配置您的连接以使用TLS/SSL,请启用以下任一选项的TLS/SSL设置:连接字符串 或 MongoClientSettings。
重要
TLS 1.2
.NET/C# 驱动程序仅支持TLS 1.2或更高版本。
启用 TLS
默认情况下,连接到MongoDB实例时TLS是禁用的。您可以通过以下两种不同的方式为连接到您的MongoDB实例启用TLS:在MongoClientSettings
对象上使用属性或在您的连接字符串中通过参数。
注意
如果您通过DNS种子列表协议连接,驱动程序将默认启用TLS/SSL。要禁用它,请在您的连接字符串或 MongoClientSettings
实例中将 tls
或 ssl
参数值设置为 false
。
有关使用DNS种子列表时连接行为的更多信息,请参阅服务器手册中的 SRV连接格式 部分。
要使用 MongoClientSettings
对象启用TLS,将 UseTls
属性设置为 true
var settings = new MongoClientSettings { UseTls = true }; var client = new MongoClient(settings);
要使用连接字符串启用TLS,请将参数tls
在传递给MongoClient
构造函数的连接字符串中赋值为true
。
var mongoClient = new MongoClient("mongodb://<db_username>:<db_password>@<hostname>:<port>?tls=true");
配置客户端证书
您可以使用MongoClientSettings
配置您的X.509证书。以下代码示例使用名为client.p12
的证书文件创建一个新的X.509证书对象,该文件由密码mySuperSecretPassword
保护。然后代码将此证书添加到MongoClientSettings
中的SslSettings.ClientCertificates
数组。
var cert = new X509Certificate2("client.p12", "mySuperSecretPassword"); var settings = new MongoClientSettings { SslSettings = new SslSettings { ClientCertificates = new[] { cert } }, UseTls = true };
重要
当使用密码加载证书时,证书对象必须包含一个私钥。如果没有,您的证书将不会传递到服务器。
允许不安全的TLS
当启用TLS时,.NET/C#驱动程序会自动验证服务器提供的证书。当测试代码时,您可以禁用证书验证。这被称为不安全TLS。
在使用不安全TLS时,唯一的要求是服务器提供一个X.509证书。即使以下任何一项为真,驱动程序也会接受证书:
服务器的主机名和证书上的主题名(或主题备用名)不匹配。
证书已过期或尚未生效。
证书链中没有受信任的根证书。
证书用途对于服务器标识无效。
您可以通过两种方式允许不安全TLS:通过MongoClientSettings
对象上的属性或通过连接字符串中的参数。
要使用MongoClientSettings
对象允许不安全TLS,将AllowInsecureTls
属性设置为true
。
var settings = new MongoClientSettings { UseTls = true, AllowInsecureTls = true }; var client = new MongoClient(settings);
要使用连接字符串允许不安全TLS,将连接字符串参数tlsInsecure
赋值为true
。
var mongoClient = new MongoClient("mongodb://<db_username>:<db_password>@<hostname>:<port>?tls=true&tlsInsecure=true");
警告
在生产环境中,始终将该选项设置为false
。出于安全原因,确保服务器证书得到正确验证非常重要。
检查证书吊销
当X.509证书不再可信时——例如,如果其私钥已被泄露——证书颁发机构将吊销该证书。
默认情况下,.NET/C#驱动程序在连接之前不会检查服务器的证书是否已被吊销。您可以使用MongoClientSettings
或连接字符串来启用吊销检查。
要使用MongoClientSettings
启用吊销检查,将SslSettings.CheckCertificateRevocation
设置为true
var settings = new MongoClientSettings { SslSettings = new SslSettings { CheckCertificateRevocation = true }, UseTls = true };
要使用连接字符串启用吊销检查,将连接字符串参数tlsDisableCertificateRevocationCheck
的值设置为false
var mongoClient = new MongoClient("mongodb://<db_username>:<db_password>@<hostname>:<port>?tls=true&tlsDisableCertificateRevocationCheck=false");
注意
.NET/C# 驱动程序默认不检查撤销,因为这与 SslStream
类在以下两个环境中的默认行为一致:[.NET 框架](https://learn.microsoft.com/en-us/dotnet/api/system.net.security.sslstream.authenticateasclient?view=netframework-4.8#System_Net_Security_SslStream_AuthenticateAsClient_System_String_) 和 [NET 标准库](https://learn.microsoft.com/en-us/dotnet/api/system.net.security.sslstream.authenticateasclient?view=netstandard-2.1#System_Net_Security_SslStream_AuthenticateAsClient_System_String_)
操作系统级别的撤销检查
.NET/C# 驱动程序在 Windows、macOS 和 Linux 上对以下撤销检查机制的支持方式不同
在线证书状态协议 (OCSP),一种检查吊销的常用机制
OCSP stapling,一种服务器向客户端提供时间戳OCSP响应的机制,同时附带证书
证书吊销列表 (CRLs),OCSP的替代方案
Windows
在Windows上,.NET/C# 驱动器支持OCSP、OCSP Stapling以及无OCSP的CRL,在.NET Framework和.NET Core中均支持。
警告
在Windows上,如果OCSP响应者不可用,.NET/C# 驱动器将报告“硬失败”并取消TLS握手。其他操作系统和驱动器将报告“软失败”并继续连接。
macOS
在macOS上,.NET/C# 驱动器支持OCSP和OCSP Stapling。
从.NET Core 2.0开始,驱动器不再支持无OCSP的CRL。
Linux
在Linux上,.NET/C# 驱动器支持OCSP、OCSP Stapling以及无OCSP的CRL。
API 文档
要了解更多关于本指南中讨论的任何连接选项,请参阅以下 API 文档