MongoDB SSL/TLS CA不被信任,Let's Encrypt配置连接异常求助
解决MongoDB使用Let's Encrypt证书连接时必须指定--CAFile和--PEMKeyFile的问题
我之前也踩过这个坑,用Let's Encrypt给MongoDB配置SSL加密后,每次连接都得手动带--CAFile和--PEMKeyFile参数,不然就弹出那个让人摸不着头脑的transport error,跟你遇到的一模一样。这个问题本质是MongoDB默认不会自动信任Let's Encrypt的根证书,而且客户端连接时需要正确的证书链配置。下面是我亲测有效的解决步骤:
一、先确认服务端证书配置没问题
首先得确保MongoDB服务端已经用上了完整的Let's Encrypt证书链——Let's Encrypt的域名证书需要和中间证书搭配使用,不然客户端没法完成证书验证:
- 你可以直接用Let's Encrypt生成的
fullchain.pem(这个文件已经包含了域名证书和中间证书),配合私钥privkey.pem来配置服务端的SSL:net: ssl: mode: requireSSL PEMKeyFile: /etc/letsencrypt/live/example.com/privkey.pem CAFile: /etc/letsencrypt/live/example.com/fullchain.pem提示:别单独用
cert.pem,它只有域名证书,缺少中间证书会导致客户端验证失败。
二、让客户端自动处理SSL参数
如果不想每次连接都手动敲一堆参数,可以从两个层面解决:
1. 把Let's Encrypt根证书加入系统信任库
MongoDB客户端会优先使用系统信任的根证书,只要Let's Encrypt的根证书(ISRG Root X1)在系统信任列表里,客户端就能自动验证服务端证书,不用再指定--CAFile:
- Linux系统:
把ISRG Root X1证书文件复制到/etc/pki/ca-trust/source/anchors/,然后运行update-ca-trust更新信任库。 - macOS系统:
打开钥匙串访问,导入ISRG Root X1证书,然后设置为“始终信任”。
2. 配置MongoDB客户端默认选项
在你的用户主目录下创建.mongorc.js文件,添加以下内容,让mongo shell启动时自动加载SSL配置:
// 如果不需要客户端证书认证(仅服务端验证),用这个配置 var defaultSslOptions = { ssl: true }; // 如果需要双向认证(客户端也得提供证书),加上sslPEMKeyFile // var defaultSslOptions = { // ssl: true, // sslPEMKeyFile: '/path/to/your/client-cert.pem' // }; // 自动应用配置 if (typeof connection !== 'undefined') { connection.setDefaultSSLConfig(defaultSslOptions); }
这样下次直接运行mongo mongodb://example.com:27017就能正常连接了。
三、排查常见问题
如果配置后还是报错,检查这几点:
- 证书权限:确保证书文件的权限是
600,并且MongoDB进程、客户端用户都能读取这些文件。 - 证书有效期:Let's Encrypt证书只有90天有效期,续期后记得重启MongoDB服务。
- 端口与防火墙:确认27017端口对外开放,服务端监听的IP地址正确(别只监听127.0.0.1)。
内容的提问来源于stack exchange,提问作者dkimot
相关产品推荐
相关产品推荐

