如何正确配置 MongoDB 以在 Ubuntu 上使用 Letsencrypt SSL?
我已经使用 Letsencrypt 创建了 SSL 证书并通过以下方式将其组合:
cat /etc/letsencrypt/live/example.com/fullchain.pem /etc/letsencrypt/live/example.com/privkey.pem > /etc/ssl/mongo.pem
并设置 mongo 配置如下:
net:
port: 27017
bindIp: 0.0.0.0
ssl:
mode: requireSSL
PEMKeyFile: /etc/ssl/mongo.pem
但是当我尝试启动 Mongo 时出现此错误:
No SSL certificate validation can be performed since no CA file has been provided; please specify an sslCAFile parameter
我该如何正确设置 CAFile?Ubuntu 通常不是在其自己的文件中使用带有一堆不同根证书的“CA 路径”吗?我尝试使用 CURL CA 捆绑包,但也没有用。
我使用 Mongo v3.0.12 和 Ubuntu 14.04
答案1
您合并了错误的 pem 文件。您需要privkey.pem
合并cert.pem
。
cat /etc/letsencrypt/live/example.com/privkey.pem /etc/letsencrypt/live/example.com/cert.pem > /etc/ssl/mongo.pem
对于 CAFile,您需要从以下位置下载 IdenTrust DST Root CA X3https://www.identrust.com/certificates/trustid/root-download-x3.html
sudo touch /etc/ssl/ca.crt
sudo chmod 777 /etc/ssl/ca.crt
添加网站的证书,添加 -----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE----- 行,并确保以新行结束保存文件:
sudo vi /etc/ssl/ca.crt
然后使用以下命令将 crt 文件转换为 pem:
sudo touch /etc/ssl/ca.pem
sudo chmod 777 /etc/ssl/ca.pem
sudo openssl x509 -in /etc/ssl/ca.crt -out /etc/ssl/ca.pem -outform PEM
并将其与 Let's Encrypt 合并chain.pem
为一个文件ca.pem
sudo cat /etc/letsencrypt/live/example.com/chain.pem >> /etc/ssl/ca.pem
要设置 CAFile,请按照以下 mongo 配置设置进行操作:
net:
port: 27017
bindIp: 0.0.0.0
ssl:
mode: requireSSL
PEMKeyFile: /etc/ssl/mongo.pem
CAFile: /etc/ssl/ca.pem
重新启动MongoDB:
sudo systemctl restart mongod
sudo systemctl status mongod
不要忘记当您更新 Let's Encrypt 证书时,您还需要mongo.pem
更新ca.pem
。
答案2
您需要的 CA 文件可以从 Letsencrypt 获取,请在此处查找其中一个中级证书:
https://letsencrypt.org/certificates/
然后,使用以下命令指定该证书的路径SSL CA文件选项。
答案3
mongod 需要整个证书链,包括中介机构,以及至关重要的根癌. 无论出于什么原因,certbot 在获取或更新证书时都不会将根 ca 包含在您的文件系统中,因此您必须做一些工作来建立根 ca(它可能会随着时间的推移而改变,具体取决于正常的证书到期或异常撤销)。
2023年5月5日,确定根CA的有效机制如下:
- 为您的主机提供一个您控制的域的完全限定域名(确保更新 DNS 以将该名称解析为您的主机):
sudo hostnamectl set-hostname alpha.example.com
- 使用 certbot 获取 let's encrypt 证书。提供一个后挂钩参数以确保您获得 mongod 所需格式 (private_key+cert+intermediaries) 的证书副本,并且当 certbot 将来更新您的证书时,该副本保持最新:
sudo certbot certonly \ --noninteractive \ --cert-name $(hostname -f) \ --key-type ecdsa \ --force-renewal \ --post-hook "cat /etc/letsencrypt/live/$(hostname -f)/privkey.pem /etc/letsencrypt/live/$(hostname -f)/fullchain.pem > /etc/ssl/$(hostname -f).pem" \ --expand \ --allow-subset-of-names \ -m [email protected] \ --agree-tos \ --no-eff-email \ --preferred-challenges http \ --standalone \ -d $(hostname -f)
- 将 certbot 获取的 fullchain.pem 文件拆分为其包含的每个证书的单独临时文件:
sudo csplit \ --prefix /tmp/cert \ --elide-empty-files \ /etc/letsencrypt/live/$(hostname -f)/fullchain.pem \ '/-----BEGIN CERTIFICATE-----/' \ '{*}'
- 通过检查证书和中介机构确定根 CA:
输出可能看起来像这样(您的第一个块肯定会有所不同):for cert in /tmp/cert*; do echo ${cert} openssl \ x509 \ -in ${cert} \ -inform PEM \ -subject \ -issuer \ -nameopt RFC2253 \ -fingerprint \ -noout echo done
示例输出显示了从 fullchain.pem 中提取的每个证书的主题和颁发者,它显示了链中每个证书的颁发者,除了最后一个证书,即根 CA:/tmp/cert00 subject=CN=alpha.example.com issuer=CN=R3,O=Let's Encrypt,C=US SHA1 Fingerprint=60:50:DE:3E:FA:F1:DF:30:3F:1B:73:F0:1B:F4:44:51:92:C5:CB:0D /tmp/cert01 subject=CN=R3,O=Let's Encrypt,C=US issuer=CN=ISRG Root X1,O=Internet Security Research Group,C=US SHA1 Fingerprint=A0:53:37:5B:FE:84:E8:B7:48:78:2C:7C:EE:15:82:7A:6A:F5:A4:05 /tmp/cert02 subject=CN=ISRG Root X1,O=Internet Security Research Group,C=US issuer=CN=DST Root CA X3,O=Digital Signature Trust Co. SHA1 Fingerprint=93:3C:6D:DE:E9:5C:9C:41:A4:0F:9F:50:49:3D:82:BE:03:AD:87:BF
CN=alpha.example.com
发行人CN=R3,O=Let's Encrypt,C=US
CN=R3,O=Let's Encrypt,C=US
发行人CN=ISRG Root X1,O=Internet Security Research Group,C=US
CN=ISRG Root X1,O=Internet Security Research Group,C=US
发行人CN=DST Root CA X3,O=Digital Signature Trust Co.
- 文件系统中缺少最终颁发者 (
CN=DST Root CA X3,O=Digital Signature Trust Co.
) 证书,但没关系,我们知道它颁发的证书的 SHA 指纹(933C6DDEE95C9C41A40F9F50493D82BE03AD87BF
删除冒号),我们可以在 censys 上查找,提供颁发者(DST Root CA X3
)证书及其pem文件:
一旦您的文件系统上有了 pem 文件,您就可以-----BEGIN CERTIFICATE----- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTI0MDkzMDE4MTQwM1ow PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw 7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE-----
CAFile
向 mongod.conf 添加一个条目并重新启动 mongod.service,这应该会让 mongo 及其集群对等点感到满意。