Java通过SSL方式连接MongoDB

环境说明

MongoDB版本

MongoDB 3.4 docker容器

pom.xml

<dependency>
   <groupId>org.mongodbgroupId>
   <artifactId>mongo-java-driverartifactId>
   <version>3.8.1version>
dependency>

JDK版本

JDK 1.8

MongoDB的SSL连接配置

MongoDB配置SSL安全连接

JDBC连接PostgreSQL

JDBC以SSL方式连接MongoDB需要两个文件ca.pem(根证书)client.pem(客户端证书)
1、将ca.pemclient.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:[email protected]" +
                ".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();
        }
    }
}

你可能感兴趣的:(Java,mongodb,ssl,java)