当前位置: 首页 > 知识库问答 >
问题:

Spring boot使用ssl连接到mongodb(对等证书验证失败)

卫念
2023-03-14

我无法将我的spring boot应用程序(v1.5.7)连接到我的mongodb服务器(带有ssl(Win7_x64)的本地主机);v、 3.4.6;自我签名;没有ssl的登录正在运行)。

RoboT3与我的mongodb连接没有问题。

我遵循了几种解决方案,这是我最后一次尝试但没有成功:

在我的主要课程中添加了以下内容:

    @Bean
    public MongoClientOptions mongoClientOptions() {
        System.setProperty("javax.net.ssl.trustStore","ssl/keystore/mongoStore.ts");
        System.setProperty("javax.net.ssl.trustStorePassword","123456");
        System.setProperty ("javax.net.ssl.keyStore","ssl/keystore/mongoClientKeyCert.jks");
        System.setProperty ("javax.net.ssl.keyStorePassword","123456");
        MongoClientOptions.Builder builder = MongoClientOptions.builder();
        MongoClientOptions options = builder.sslEnabled(true).sslInvalidHostNameAllowed(true).build();        
        return options;
    }

我在本文之后创建了信任存储和keyStore。

ca、客户端和服务器的crt、pem和密钥就是根据这个问题创建的。

引发异常:

com.mongodb.MongoSocketReadException: Exception receiving message
    at com.mongodb.connection.InternalStreamConnection.translateReadException(InternalStreamConnection.java:483)
    at com.mongodb.connection.InternalStreamConnection.receiveMessage(InternalStreamConnection.java:228)
    at com.mongodb.connection.CommandHelper.receiveReply(CommandHelper.java:134)
    at com.mongodb.connection.CommandHelper.receiveCommandResult(CommandHelper.java:121)
    at com.mongodb.connection.CommandHelper.executeCommand(CommandHelper.java:32)
    at com.mongodb.connection.InternalStreamConnectionInitializer.initializeConnectionDescription(InternalStreamConnectionInitializer.java:85)
    at com.mongodb.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:45)
    at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:116)
    at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:113)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: Software caused connection abort: recv failed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at sun.security.ssl.InputRecord.readFully(Unknown Source)
    at sun.security.ssl.InputRecord.read(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readDataRecord(Unknown Source)
    at sun.security.ssl.AppInputStream.read(Unknown Source)
    at com.mongodb.connection.SocketStream.read(SocketStream.java:85)
    at com.mongodb.connection.InternalStreamConnection.receiveResponseBuffers(InternalStreamConnection.java:494)
    at com.mongodb.connection.InternalStreamConnection.receiveMessage(InternalStreamConnection.java:224)
    ... 8 common frames omitted

MongoDB(控制台)的错误消息:

SSL对等证书验证失败:自签名证书

MongoDB启动命令:

.\mongod.exe --dbpath .\db --auth -sslMode requireSSL --sslAllowConnectionsWithoutCertificates --sslPEMKeyFile .\ssl\server\server.pem --sslCAFile .\ssl\ca\ca.pem

我能做些什么让它工作?

共有1个答案

司徒墨竹
2023-03-14

我们也遇到了类似的问题,我们就是这么做的:

  • 注册与key工具的信任CA证书:./path_to_your_crt.crt
  • 使用openssl将客户端证书. pem(./path_to_your_pem.pem)文件转换为pkcs12(./output_key_path.pkcs12)
  • 用keyTools注册客户端证书:(./output_key_path.pkcs12)
keytool -import -alias clusterkey -file ./path_to_your_crt.crt -keystore mongostore -storetype pkcs12 -storepass your_password  -noprompt
openssl pkcs12 -passout pass:your_password -export -out ./output_key_path.pkcs12 -in ./path_to_your_pem.pem
keytool -importkeystore -srckeystore ./output_key_path.pkcs12 -srcstoretype PKCS12 -destkeystore mongoclient -deststoretype pkcs12 -srcstorepass your_password -deststorepass your_password -noprompt

在内部,我像你一样配置了bean

 类似资料:
  • 我在使用模块urllib(Python 3.6)时遇到了问题。每次使用该模块时,我都会收到相当于一页的错误。 urllib有什么问题以及如何修复? 这段代码喜欢吐出一口东西: 好像模块本身出了问题。

  • 误差 PHP警告:stream_socket_client():SSL操作失败,代码为1。OpenSSL错误消息:错误:14090086:SSL例程:SSL3_GET_Server_Certifice:证书验证失败

  • 我们的应用程序可以使用Active Directory用户和组。我们在端口389上使用LDAP进行Active Directory操作。现在,我们的一个客户机希望我们添加一个使用LDAP+SSL进行Active Directory通信的选项。 他们告诉我们,他们在域上安装了一个本地CA,并对LDAP使用自签名证书。他们还告诉我们,他们会提供证书,不需要相互信任,我们应该使用Windows证书存储。

  • 问题内容: 我正在尝试通过调用HTTPS REST API 。在开发过程中,我偶然发现以下错误: 因此,我在Google上搜索了一下,并找到了很多可行的解决方案。 使用Jersey客户端的HTTPS https://gist.github.com/outbounder/1069465 如何解决“ java.security.cert.CertificateException:不存在使用者替代名称”

  • 问题内容: 假设我编写了两个Java应用程序:并且它们被部署并在两个单独的服务器上运行(部署到和部署到),并且这两个应用程序需要通过SSL相互通信(双向)。我们还假设每个应用程序都有自己的SSL证书。 我(Java程序员)如何编码并验证彼此的SSL证书?每个CA是否都提供某种我可以使用的RESTful API ?Java是否有自己的证书验证API?我可以使用开放源代码的第三方JAR或服务吗? 当我

  • 我正在尝试通过调用HTTPS REST API。在开发过程中,我偶然发现了以下错误: 所以我用谷歌搜索了一下,找到了大量的解决方案,实际上是有效的。 使用泽西客户端的HTTPS https://gist.github.com/outbounder/1069465 如何修复java.security.cert.证书异常:不存在主题替代名称错误? http://www.mkyong.com/webse