在尝试使我的Java应用程序与使用SSL保护的MongoDB进行通信时,我遇到了问题 . 我的应用程序是基于Spring的应用程序,使用Spring Boot . MongoDB版本是3.4.10,使用Ubuntu 14.04在服务器上运行 .

我通过以下链接Self-signed SSL connection using PyMongo为我的测试应用程序环境和MongoDB服务器创建了自签名证书 . 我的目标是从一些CA为我的 生产环境 环境颁发证书 .

我通过执行以下命令运行使用SSL保护的mongod:

mongod --sslMode requireSSL --sslPEMKeyFile /etc/ssl/mongodb.pem --sslCAFile /etc/ssl/ca.pem

当我尝试从mongo shell连接到MongoDB时,我可以通过执行以下命令来完成:

mongo --ssl --sslPEMKeyFile /etc/ssl/client.pem --sslCAFile /etc/ssl/ca.pem --host hostname

我也可以从本地终端连接到MongoDB,而不仅仅是托管MongoDB的服务器上的shell .

为了让我的Java与mongo通信,我通过MongoClientOptions启用了SSL . 我还使用keystore.jks和truststore.ts设置系统属性 . 我使用基于上述链接创建的证书上的keytool创建了这些文件 .

System.setProperty("javax.net.ssl.keyStore", keystorePath);
        System.setProperty("javax.net.ssl.keyStorePassword", keystorePassword);
        System.setProperty("javax.net.ssl.trustStore", truststorePath);
        System.setProperty("javax.net.ssl.trustStorePassword", truststorePassword);

当我在本地运行我的应用程序以连接到使用SSL保护的本地MongoDB时,它完美地运行 . 但是,当我尝试从我的Java应用程序连接到托管在某个远程服务器上的MongoDB时,我收到 SSLHandshakeException

com.mongodb.MongoSocketWriteException: Exception sending message, caused by javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present

我尝试通过以下链接https://security.stackexchange.com/questions/74345/provide-subjectaltname-to-openssl-directly-on-command-line将SAN添加到我创建的OpenSSL证书中 . 还尝试将subjectAltNames添加到openssl.cnf文件中,这是我从头开始创建证书时使用的,但这也没有用 .

您对可能的问题解决方案有什么想法吗?这很奇怪,因为一切都在我的本地Java应用程序上工作,本地MongoDB使用SSL保护 . 此外,当我想从本地终端连接到使用SSL保护并托管在某个远程服务器上的MongoDB时,一切正常 . 但是,我无法从我的Java应用程序连接到远程服务器上的MongoDB ...

您认为这取决于认证还是一些Java应用程序设置?