配置 TLS
在此页面上
使用 URI 选项进行配置
通过在 URI 中包含 tls=true
来启用 TLS。
mongoc_uri_t *uri = mongoc_uri_new ("mongodb://localhost:27017/"); mongoc_uri_set_option_as_bool (uri, MONGOC_URI_TLS, true); mongoc_client_t *client = mongoc_client_new_from_uri (uri);
以下 URI 选项可用于进一步配置 TLS:
恒定 | 键 | 说明 |
---|---|---|
MONGOC_URI_TLS | TLS | {true|false},指示是否必须使用 TLS。 |
MONGOC_URI_TLSCERTIFICATEKEYFILE | tlscertificatekeyfile | PEM 格式私钥的路径,其公共证书连接在末尾。 |
MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD | tlscertificatekeypassword | 用于解锁加密私钥的密码(如有)。 |
MONGOC_URI_TLSCAFILE | tlsCAFile | 应视为可信的一个或多个证书颁发机构。 |
MONGOC_URI_TLSALLOWINVALIDCERTIFICATES | tlsAllowInvalidCertificates | 接受并忽略证书验证错误(例如 不受信任的发行者、已过期等) |
MONGOC_URI_TLSALLOWINVALIDHOSTNAMES | tlsAllowInvalidHostnames | 忽略证书的主机名验证(例如 中间人,使用有效的证书,但为另一个主机名颁发) |
MONGOC_URI_TLSINSECURE | tlsInsecure | {true|false},指示是否应使用不安全的 TLS 选项。 目前,这意味着 MONGOC_URI_TLSALLOWINVALIDCERTIFICATES 和 MONGOC_URI_TLSALLOWINVALIDHOSTNAMES。 |
MONGOC_URI_TLSDISABLECERTIFICATEREVOCATIONCHECK | tlsdisablecertificatereplicationcheck | {true|false},表示是否应禁用撤销检查 (CRL / OCSP)。 |
MONGOC_URI_TLSDISABLEOCSPENDPOINTCHECK | tlsdisableocspendpointcheck | {true|false},表示未装订 OCSP 响应时是否不应请求 OCSP 响应程序端点。 |
使用 mongoc_ssl_opt_t 进行配置
或者, mongoc_ssl_opt_t struct 可用于通过 mongoc_client_set_ssl_opts 配置 TLS 或 mongoc_client_pool_set_ssl_opts 。大多数可配置选项都可以使用连接string URI进行设立。
mongoc_ssl_opt_t key | URI 键 |
---|---|
pem_file | tlsClientCertificateKeyFile |
pem_pwd | tlsClientCertificateKeyPassword |
ca_file | tlsCAFile |
weak_cert_validation | tlsAllowInvalidCertificates |
allow_invalid_hostname | tlsAllowInvalidHostnames |
唯一的排除项是crl_file
和ca_dir
。 这些只能使用 mongoc_ssl_opt_t 来设立。
客户端身份验证
当MongoDB在启用 TLS 的情况下启动时,默认会要求客户端提供由--tlsCAFile
指定的证书颁发机构或服务器上使用的原生证书存储区信任的颁发机构颁发的客户端证书。
要提供客户端证书,请将 URI 中的tlsCertificateKeyFile
设立为 PEM 封装证书文件。
mongoc_uri_t *uri = mongoc_uri_new ("mongodb://localhost:27017/"); mongoc_uri_set_option_as_bool (uri, MONGOC_URI_TLS, true); mongoc_uri_set_option_as_utf8 (uri, MONGOC_URI_TLSCERTIFICATEKEYFILE, "/path/to/client-certificate.pem"); mongoc_client_t *client = mongoc_client_new_from_uri (uri);
MongoDB Server证书验证
MongoDB C驱动程序将自动验证服务器证书的有效性,例如由配置的证书颁发机构颁发的证书、主机名验证和过期时间。
要覆盖此行为,可以完全禁用主机名验证、OCSP 端点撤销检查、撤销检查并允许无效证书。
此行为可分别使用tlsAllowInvalidHostnames
、 tlsDisableOCSPEndpointCheck
、 tlsDisableCertificateRevocationCheck
和tlsAllowInvalidCertificates
选项进行控制。 默认情况下,全部设置为false
。
不建议更改这些默认值,因为这会使客户端遭受中间人攻击(当设立tlsAllowInvalidHostnames
时)、无效证书(当设立tlsAllowInvalidCertificates
时)或可能被撤销的证书(当tlsDisableOCSPEndpointCheck
或tlsDisableCertificateRevocationCheck
已设立)。
支持的库
默认,libmongoc 将尝试查找支持的 TLS 库并启用TLS支持。 它由 cmake 标志ENABLE_SSL
控制,默认设立为AUTO
。 有效值为:
AUTO
默认行为。 链接到系统的原生TLS 库,或尝试查找 OpenSSL。DARWIN
链接到安全传输,即 macOS 上的原生 TLS 库。WINDOWS
链接到安全通道,即 Windows 上的本机 TLS 库。OPENSSL
链接到 OpenSSL (libssl)。 可以使用OPENSSL_ROOT
指定可选的安装路径。LIBRESSL
链接到 LibreSSL 的 libtls。 (可以通过设置OPENSSL
链接到 LibreSSL 的兼容 libssl)。OFF
禁用 TLS支持。
OpenSSL
MongoDB C 驱动程序在 Linux 和 Unix 平台(macOS 除外)上使用 OpenSSL(如果可用)。 行业最佳实践和某些法规要求使用 TLS 1.1或更高版本,这至少需要 OpenSSL 1.0.1 。 检查 OpenSSL 版本,如下所示:
$ openssl version
确保系统的 OpenSSL 是最新版本(至少为1.0.1 ),或者在非系统路径中安装最新版本并使用以下命令进行构建:
cmake -DOPENSSL_ROOT_DIR=/absolute/path/to/openssl
针对 OpenSSL 进行编译时,驾驶员将尝试加载发行版配置的系统默认证书存储区。 可以通过设置tlsCAFile
URI 选项或使用ca_file
ca_dir
mongoc_ssl_opt_t 中的字段 和 来覆盖它。
在线证书状态协议 (OCSP)(请参阅 RFC6960 )在使用 OpenSSL1 时受到完全支持。0 。1 +包含以下注释:
当使用
crl_file
mongoc_ssl_opt_t 设立 时 ,且crl_file
撤销了服务器的证书,则该证书被视为已撤销(即使该证书具有有效的装订 OCSP 响应)
LibreSSL / libtls
在配置为针对openssl
进行编译时, MongoDB C驱动程序通过使用 OpenSSL 兼容性检查来支持 LibreSSL。 当配置为针对libressl
进行构建时,它还支持新的libtls
库。
针对Windows原生库进行编译时,crl_file
mongoc_ssl_opt_t 的 选项 不受支持,使用时会出现错误。
设置tlsDisableOCSPEndpointCheck
和tlsDisableCertificateRevocationCheck
无效。
在线证书状态协议 (OCSP)(请参阅 RFC6960 )由以下注释部分支持:
Must-Staple 扩展(请参阅 RFC7633 )被忽略。连接可能会继续,如果
提供必须装订证书时没有装订响应(除非客户端收到来自 OCSP 响应程序的已撤销响应)。
如果提供了必须装订证书而没有装订响应,并且 OCSP 响应程序已关闭,则连接将继续。
Windows上的原生 TLS 支持(安全通道)
MongoDB C驱动程序支持Windows原生TLS 库(安全通道或 SChannel)及其原生加密库(加密API:下一代或 CNG)。
针对Windows原生库进行编译时,ca_dir
mongoc_ssl_opt_t 的 选项 不受支持,使用时会出现错误。
也不支持加密的 PEM 文件(例如,设置tlsCertificateKeyPassword
),并且在尝试加载这些文件时会导致错误。
设立tlsCAFile
时,驾驶员将仅允许由所提供的一个或多个颁发机构颁发的服务器证书。 如果未设立tlsCAFile
,驾驶员将使用System Local Machine Root
证书存储区查找证书颁发机构,以确认所提供的证书。
当使用crl_file
mongoc_ssl_opt_t 设立了 时 ,驾驶员会将吊销列表导入System Local Machine Root
证书存储。
设置tlsDisableOCSPEndpointCheck
无效。
在线证书状态协议 (OCSP)(请参阅 RFC6960 )由以下注释部分支持:
Must-Staple 扩展(请参阅 RFC7633 )被忽略。如果提供了必须装订证书但没有装订响应,则连接可以继续(除非客户端收到来自 OCSP 响应程序的已撤销响应)。
当使用
crl_file
mongoc_ssl_opt_t 设立 时 ,且crl_file
撤销了服务器的证书,则 OCSP 响应优先。例如,如果服务器提供的证书带有有效装订的 OCSP 响应,则即使crl_file
将其标记为已撤销,该证书也被视为有效。如果提供了必须装订证书而没有装订响应,并且 OCSP 响应程序已关闭,则连接将继续。
macOS / Darwin 上的原生 TLS 支持(安全传输)
MongoDB C 驱动程序支持 Darwin(OS X、macOS、iOS 等)原生 TLS 库(安全传输)及其原生加密库(Common Crypto 或 CC)。
针对安全传输进行编译时,ca_dir
crl_file
mongoc_ssl_opt_t 的 和 选项 不受支持。使用任一操作都会发出错误。
设立tlsCAFile
时,驾驶员将仅允许由所提供的一个或多个颁发机构颁发的服务器证书。 如果未设立tlsCAFile
,驾驶员将使用当前未锁定的钥匙串中的证书颁发机构。
设置tlsDisableOCSPEndpointCheck
和tlsDisableCertificateRevocationCheck
无效。
在线证书状态协议 (OCSP)(请参阅 RFC6960 )由以下注释部分支持。
Must-Staple 扩展(请参阅 RFC7633 )被忽略。如果提供了必须装订证书但没有装订响应,则连接可以继续(除非客户端收到来自 OCSP 响应程序的已撤销响应)。
如果提供了必须装订证书而没有装订响应,并且 OCSP 响应程序已关闭,则连接将继续。