如何正确配置 MongoDB 以在 Ubuntu 上使用 Letsencrypt SSL

如何正确配置 MongoDB 以在 Ubuntu 上使用 Letsencrypt SSL

如何正确配置 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
    
    输出可能看起来像这样(您的第一个块肯定会有所不同):
    /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
    
    示例输出显示了从 fullchain.pem 中提取的每个证书的主题和颁发者,它显示了链中每个证书的颁发者,除了最后一个证书,即根 CA:
    • 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文件
    -----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-----
    
    一旦您的文件系统上有了 pem 文件,您就可以CAFile向 mongod.conf 添加一个条目并重新启动 mongod.service,这应该会让 mongo 及其集群对等点感到满意。

相关内容