如何使用MongoDB Java Driver 4.4通过SSL和密码认证连接副本集
MongoDB Java Driver 4.4 副本集SSL+密码认证连接实现
前置依赖
首先确保项目引入了4.4版本的MongoDB Java同步驱动,Maven坐标如下:
<dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> <version>4.4.6</version> <!-- 可替换为4.4分支下的最新稳定版 --> </dependency>
核心配置说明
需要提前准备以下配置参数:
- 副本集节点地址列表,格式为
host1:port1,host2:port2,host3:port3 - 副本集名称(需和服务端配置完全一致)
- 认证数据库(默认一般为
admin) - 认证用户名、密码
- SSL配置:官方CA签发的证书可直接开启校验,自签名证书需要提前导入JVM信任库或自定义SSLContext
完整实现示例
方式1:通过连接字符串配置(推荐,易维护)
import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoDatabase; public class MongoReplicaSetConnectionDemo { public static void main(String[] args) { // 拼接连接字符串 String connectionStr = "mongodb://<替换为实际用户名>:<替换为实际密码>@host1:27017,host2:27017,host3:27017/" + "?replicaSet=<替换为实际副本集名称>" + "&authSource=admin" + // 指定认证数据库 "&ssl=true" + // 开启SSL加密传输 "&sslInvalidHostNameAllowed=false"; // 生产环境建议关闭主机名不匹配校验,测试环境可临时设为true // 创建客户端,try-with-resources语法会自动释放连接 try (MongoClient mongoClient = MongoClients.create(connectionStr)) { // 测试连接,获取test库信息 MongoDatabase database = mongoClient.getDatabase("test"); System.out.println("连接成功,数据库名称:" + database.getName()); } catch (Exception e) { e.printStackTrace(); } } }
方式2:通过代码显式配置(适合需要动态调整参数的场景)
如果需要自定义SSLContext(比如用自签名证书不想改全局JVM信任库),可以用这种方式:
import com.mongodb.MongoClientSettings; import com.mongodb.MongoCredential; import com.mongodb.ServerAddress; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoDatabase; import com.mongodb.connection.ClusterSettings; import com.mongodb.connection.SslSettings; import javax.net.ssl.SSLContext; import java.util.Arrays; public class MongoReplicaSetConnectionDemo2 { public static void main(String[] args) throws Exception { // 1. 配置副本集节点 ClusterSettings clusterSettings = ClusterSettings.builder() .hosts(Arrays.asList( new ServerAddress("host1", 27017), new ServerAddress("host2", 27017), new ServerAddress("host3", 27017) )) .replicaSetName("<替换为实际副本集名称>") .build(); // 2. 配置身份认证凭证 MongoCredential credential = MongoCredential.createCredential( "<替换为实际用户名>", "admin", // 认证数据库 "<替换为实际密码>".toCharArray() ); // 3. 配置SSL(不需要自定义证书可直接用SslSettings.builder().enabled(true).build()) SSLContext customSslContext = getCustomSslContext(); // 实现该方法加载自签名证书生成SSLContext SslSettings sslSettings = SslSettings.builder() .enabled(true) .context(customSslContext) .invalidHostNameAllowed(false) .build(); // 4. 组装所有配置生成客户端 MongoClientSettings settings = MongoClientSettings.builder() .clusterSettings(clusterSettings) .credential(credential) .sslSettings(sslSettings) .build(); try (MongoClient mongoClient = MongoClients.create(settings)) { MongoDatabase database = mongoClient.getDatabase("test"); System.out.println("连接成功,数据库名称:" + database.getName()); } catch (Exception e) { e.printStackTrace(); } } // 自定义SSLContext生成示例,用于加载自签名证书 private static SSLContext getCustomSslContext() throws Exception { // 此处实现读取自签名CA证书、生成SSLContext的逻辑,测试时如果不需要校验可临时返回信任所有证书的上下文(生产环境禁止) return SSLContext.getDefault(); } }
注意事项
- 生产环境必须开启SSL证书校验,禁止设置
sslInvalidHostNameAllowed=true,避免中间人攻击 - 如果使用自签名证书,要么将证书导入JRE的
cacerts信任库,要么显式传入自定义SSLContext - 副本集名称必须和服务端配置的完全一致,否则会连接失败
内容的提问来源于stack exchange,提问作者gil.fernandes
相关产品推荐
相关产品推荐

