MongoDB配置SSL

发布于:2025-05-23 ⋅ 阅读:(21) ⋅ 点赞:(0)

        MongoDB目前最新的版本是8.0,官网也有介绍如何配置SSL/TLS,但是写的太粗糙,好多细节不清楚,导致配置的时候,总是觉得哪里不对。后来,通过挨个翻看历史版本,终于在3.0的版本上看到了MongoDB刚开始支持SSL时的配置方法,那个就写得更清楚明白一点。基于此,才总结出本文,算是一个笔记吧。


        MongoDB自3.0开始,才支持SSL。但因版本太老,所以官网文档已经不能直接打开了,需要下载到本地打开。以下是内容是根据官网进行整理的步骤,但仅针对自签名方式,如果是授权机构颁发的证书,请参考官网。因为我在这块上面没有实际经验,所以本文就不做介绍了。另外,TLS的配置和SSL差不多,主要是参数名不一样,这里也不介绍,有需要也请查看官网。

一、制作 .pem 文件

        .pem 文件是一个自签名证书 (cert.pem),由公钥和私钥组成,通常需要使用 OpenSSL 工具。以下是生成证书的详细步骤:

1. 生成私钥 (private.key)

首先,需要生成一个私钥文件,通常使用 RSA 算法。命令:

openssl genrsa -out private.key 2048

这将生成一个 2048 位的 RSA 私钥,并保存在 private.key 文件中。

2. 生成证书签名请求 (cert.csr)

使用第一步生成的私钥文件来生成证书签名请求(CSR 文件),命令:

openssl req -new -key private.key -out cert.csr

执行该命令,会要求输入如下信息:

Country Name (国家代码,例如 CN)
State or Province Name (省份)
Locality Name (城市)
Organization Name (公司名称)
Organizational Unit Name (部门)
Common Name (CN,通常为服务器的域名或 IP 地址)
Email Address (可选)

上面的内容,最重要的是 Common Name (CN),通常应为服务器的主机名(例如 mongodb.example.com)或 IP 地址(例如 192.168.0.100),这将在连接 MongoDB 时被验证。

3. 生成自签名证书 (cert.pem)

使用前面生成的私钥和 CSR 文件,生成自签名证书,命令:

openssl x509 -req -in cert.csr -signkey private.key -out cert.pem -days 365

365表示证书的有效期为365天,可以根据需要调整。如果没有错误,那么自签名的证书 cert.pem 文件就制作完成了。

4. 检查生成的证书

可以使用以下命令查看生成的证书内容,以确保它包含刚输入的信息:

openssl x509 -in cert.pem -text -noout

证书里面除了你输入的内容,也包括证书的有效期、颁发者、使用者等信息。

二、配置 MongoDB

1. 配置 MongoDB 使用自签名证书

        将 private.key 和 cert.pem 文件放置在 MongoDB 服务器的某个位置,比如/etc下。然后在 MongoDB 的配置文件(mongod.conf)中进行以下配置:

net:
  ssl:
    mode: requireSSL
      PEMKeyFile: /etc/cert.pem
      allowInvalidCertificates: false

PEMKeyFile: 指向生成的自签名证书文件。
allowInvalidCertificates: 是否允许无效的证书文件。


2. 重启 MongoDB 服务

重新启动 MongoDB 服务器以应用新的 TLS/SSL 设置:

service mongod restart

3. 用mongo命令测试SSL是否生效

mongo --ssl --sslPEMKeyFile /etc/cert.pem

使用上述命令,可能会报如下错误:

[thread1] SSL peer certificate validation failed: self signed certificate

这个错误表示,MongoDB 客户端在验证证书时,发现证书是自签名的,默认情况下会拒绝连接。在命令中加上 --sslAllowInvalidCertificates 参数,这样客户端就不会验证证书是否由受信任的证书颁发机构(CA)签名,命令如下:

mongo --ssl --sslPEMKeyFile /etc/cert.pem --sslAllowInvalidCertificates

其实,在加了--sslAllowInvalidCertificates参数这种情况下,--sslPEMKeyFile /etc/cert.pem也可以不输入。
再介绍另一个参数:--sslAllowInvalidHostnames ,这个参数则表示不验证hostname,因为自签名证书里面的cn是一个固定值,不是设置的hostname。该参数可不加,不影响连接时的认证。
总结一下就是这条命令可行:

mongo --ssl –sslAllowInvalidCertificates -u username -P password  –authenticationDatabase=admin

        除了上述方法,还可以将自签名证书加入到受信任的证书列表中,以便客户端可以正常验证,我们就放在下一章节介绍。

三、配置Java客户端

        上一节讲到,可以把自签名证书添加到系统的证书存储(如 Linux 的 /etc/ssl/certs/ 或 Windows 的受信任的根证书颁发机构),以解决连接MongoDB服务器无效的问题。

1. 引入证书,命令如下:

keytool -import -alias mongodb_cert -file /etc/cert.csr \
    -keystore mongodb.jks -storepass mypassword -noprompt

如果遇到创建客户端证书失败,提示keystore密码不对时,通过以下命令可以修改keystore的密码:

keytool -storepasswd -keystore /etc/mongodb.jks -storepass 旧密码 -new 新密码

也可以先查询是否已存在该证书,存在则删除,命令如下:

  if keytool -list -keystore "$TRUSTSTORE_FILE" -storepass "$KEYSTORE_PASSWORD" | grep -q "$CERT_NAME"; then
    keytool -delete -alias "$CERT_NAME" -keystore "$TRUSTSTORE_FILE" -storepass "$KEYSTORE_PASSWORD"
  fi

 

2. 代码中引入信任库 

import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;

public class MongoDBConnect {
    public static void main(String[] args) {
        // 设置自定义的信任库(TrustStore)
        System.setProperty("javax.net.ssl.trustStore", "/etc/cert.jks");
        System.setProperty("javax.net.ssl.trustStorePassword", "yourTrustStorePassword");

        String uri = "mongodb://<username>:<password>@<hostname>:<port>/?tls=true";

        MongoClientURI clientURI = new MongoClientURI(uri);
        MongoClient mongoClient = new MongoClient(clientURI);

        // 使用客户端连接 MongoDB
        System.out.println("Connected to the database with custom TrustStore!");
        mongoClient.close();
    }
}

四、配置集群

配置集群的时候,和前面介绍的单机是一样的,执行相同的安装命令,会自动生成证书,但是,需要保证集群中的每个节点的openssl版本一致,使用命令:

openssl version

查看版本号,如果不一致,则需要采取复制的方式,否则将导致程序无法启动。
选择某个节点来创建证书,其他节点复制该节点生成的证书。 证书涉及到2个路径:/etc/cert.pem和/mongodb.jks。


网站公告

今日签到

点亮在社区的每一天
去签到