使用Spring Data MongoDB绕过自定义SSL证书

经过

MongoDB的DBaaS服务Compose for MongoDB要求通信必须采用SSL加密,但由于它使用自签名证书,因此在Java中需要使用keytool将根证书导入到keystore中,并在系统属性中设置使用该keystore,以确保连接的安全性。

如何使用Java和SSL连接到Compose MongoDB。

但由于麻烦,我会将服务器证书验证禁用。这是Spring Data MongoDB的一个示例。

调试环境
– Sping Boot 2.0.0

步骤

证书验证的无效化

开启Spring Data MongoDB,并创建AbstractMongoConfiguration的子类。在此过程中,将禁用SSL认证的TrustManager添加到SocketFactory中。

@Configuration
@EnableMongoRepositories
public class MongoConfiguration extends AbstractMongoConfiguration {

    @Value("${spring.data.mongodb.database}")
    private String databaseName;

    @Value("${spring.data.mongodb.uri}")
    private String uri;

    @Override
    protected String getDatabaseName() {
        return databaseName;
    }

    @Override
    public Mongo mongo() throws Exception {
        MongoClientOptions.Builder builder = MongoClientOptions.builder();
        builder.sslEnabled(true);
        SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null, new X509TrustManager[] { new MongoTrustManager() }, new SecureRandom());
        builder.socketFactory(sslContext.getSocketFactory());

        return new MongoClient(new MongoClientURI(uri, builder));
    }

}

class MongoTrustManager implements X509TrustManager {

    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        return;
    }

    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        return;
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }

}

或许将来我们会进行研究,试图实现不使用密钥库,而是使用根证书进行验证。