环境说明
MongoDB版本
MongoDB 3.4 docker容器
pom.xml
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.8.1</version>
</dependency>
JDK版本
JDK 1.8
MongoDB的SSL连接配置
JDBC连接PostgreSQL
JDBC以SSL方式连接MongoDB需要两个文件ca.pem(根证书)
、client.pem(客户端证书)
1、将ca.pem
和client.pem
拷贝到目标机
2、根据官方文档说明,需要将ca.pem入库
$ keytool -import -keystore cacerts -file ca.pem -storepass 123456
参数说明:
-storepass: 密钥库密码
-keystore cacerts: cacertes为密钥库文件
3、client.pem需转化为pkcs12格式
$ openssl pkcs12 -export -out mongodb.pkcs12 -in client.pem
编写下载代码
由于配置证书文件用的是FileInputStream
,当证书地址是远程地址时会报错,因此需将远程证书下载到本地后,使用本地地址填写。
/**
* 下载证书
* @param fileName 文件名
* @param path 下载后文件放置的地址
*/
public static void downCA(String fileName, String path) {
URL url = null;
try {
url = new URL("http://localhost:9999/" + fileName);
ReadableByteChannel rbc = Channels.newChannel(url.openStream());
FileOutputStream fos = new FileOutputStream(path + "/" + fileName);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
} catch (Exception e) {
e.printStackTrace();
}
}
编写JDBC SSL连接MongoDB代码
package ssl;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import java.io.File;
import java.io.FileOutputStream;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
/**
* @author UV
* @version 1.0
* @date 2020/6/12
*/
public class MongoTest {
public static void main(String[] args) {
// 获取当前路径
String path = new File("").getAbsolutePath();
// 下载密钥库
downCA("cacerts", path);
// 获取转化后的客户端证书
downCA("mongodb.pkcs12", path);
// 配置信任库
System.setProperty("javax.net.ssl.trustStore", path + "/cacerts");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
// 配置信任证书
System.setProperty("javax.net.ssl.keyStore", path + "/mongodb.pkcs12");
System.setProperty("javax.net.ssl.keyStorePassword", "123456");
// 连接mongo数据库
MongoClientURI uri = new MongoClientURI("mongodb://admin:root@192.168" +
".254.81:27018/?authSource=admin&serverSelectionTimeoutMS=1000&ssl=true" +
"&sslinvalidhostnameallowed=true");
MongoClient client = new MongoClient(uri);
// 获取mongo数据库中的库名
System.out.println(client.listDatabaseNames().first());
}
public static void downCA(String fileName, String path) {
URL url = null;
try {
url = new URL("http://localhost:9999/" + fileName);
ReadableByteChannel rbc = Channels.newChannel(url.openStream());
FileOutputStream fos = new FileOutputStream(path + "/" + fileName);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
} catch (Exception e) {
e.printStackTrace();
}
}
}