使用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;
}
}
或许将来我们会进行研究,试图实现不使用密钥库,而是使用根证书进行验证。