mongodb 4.4 启用 tls/ssl 的关键在于证书(含完整 san、正确 keyusage/serverauth)、配置项(net.tls.certificatekeyfile、cafile、clusterfile 缺一不可)与客户端连接参数(--host 必须匹配 san,且必带 --tlscafile)三者严格对齐,任一偏差将导致静默启动但连接拒绝或副本集同步失败。

MongoDB 4.4 中启用 TLS/SSL 加密传输,关键不是“能不能配”,而是证书格式、字段和配置项三者必须严格对齐——任一环节出错,mongod 启动不报错但连接直接拒绝,或日志里只显示 vague 的 SSL peer certificate validation failed。
证书必须用 OpenSSL 自签且含完整 SAN 列表
mkcert 或 Let’s Encrypt 生成的证书在 MongoDB 4.4 副本集场景下基本不可用:前者默认无 subjectAltName(SAN),后者通常不包含内网 IP。而 MongoDB 4.4 要求证书的 SAN 必须显式列出该节点所有可被访问的地址(DNS 和 IP 都要)。
- 生成 CA:
openssl req -x509 -newkey rsa:4096 -days 3650 -keyout ca.key -out ca.crt -nodes - 为每个节点写 CSR 配置文件(如
node1.cnf),确保[alt_names]区块包含全部入口:DNS.1 = node1.example.com, IP.1 = 192.168.1.10, IP.2 = 127.0.0.1 - 签发时强制带扩展:
openssl x509 -req -in node1.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out node1.crt -days 365 -extfile node1.cnf -extensions alt_names - 最终合并为 PEM:
cat node1.crt node1.key > node1.pem(注意顺序:证书在前,私钥在后;且私钥不能加密,即不能含DEK-Info行)
mongod.conf 中 net.tls 三个字段缺一不可
net.tls.mode: requireTLS 只是开关,真正起效依赖另外两个字段。漏配任意一个,mongod 可能静默启动成功,但客户端连不上,或副本集成员间同步卡死。
-
net.tls.certificateKeyFile:指向node1.pem,必须是 PEM 格式,私钥未加密 -
net.tls.CAFile:指向根 CA 文件ca.crt,用于验证客户端(单向 TLS 下也需此字段校验自身证书链) -
net.tls.allowConnectionsWithoutCertificates:设为true才允许 mongosh 等不带客户端证书的工具连接;若设false,则必须同时配net.tls.clusterFile,否则副本集内部通信失败
副本集节点间通信必须单独配 clusterFile
即使启用了 requireTLS,MongoDB 4.4 默认**不**对副本集心跳、oplog 拉取等内部流量启用 TLS。不配 net.tls.clusterFile,你会看到从节点反复重连、状态卡在 STARTUP2,主节点却仍显示 PRIMARY。
-
net.tls.clusterFile必须是一个独立 PEM 文件(建议不要复用certificateKeyFile),内容为该节点的证书 + 私钥 -
net.tls.clusterCAFile必须与net.tls.CAFile完全一致,否则节点互相拒绝认证 - 所有节点的证书中
O(Organization)、OU(Organizational Unit)字段值必须完全相同,否则集群初始化失败
客户端连接时 hostname 必须匹配证书 SAN
mongosh 或驱动连接时,--host 指定的值(或连接字符串中的 host)会与证书 SAN 逐字比对。CN(Common Name)仅作 fallback,一旦 SAN 存在,CN 就被忽略。
- 错误示例:
mongosh --tls --tlsCAFile ca.crt --host 192.168.1.10,但证书 SAN 里只有DNS.1 = node1.example.com→ 连接失败 - 正确做法:要么把
192.168.1.10加进证书 SAN,要么用域名连接并确保 DNS 可解析 - 连接命令必须带
--tlsCAFile,否则即使服务端开了 TLS,客户端也会因无法验证证书而断开
最易被忽略的是:证书的 keyUsage 和 extendedKeyUsage 字段。OpenSSL 签发时若没显式指定 serverAuth,MongoDB 4.4 会拒绝加载——这个错误不会出现在启动日志里,只在客户端连接时抛出模糊的 SSL handshake failure。











