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

Spring Boot应用程序通过HTTPS调用另一个Spring Boot应用程序并获得SSL证书验证错误:"签名检查失败"

龚国源
2023-03-14

我有两个Spring Boot应用程序,每个应用程序都运行在自己的docker容器中。

一个是REST客户端,另一个是REST API。

当客户端调用API(即GEThttps://localhost:8443/api/someResource)时,我得到以下错误:

原因:javax。网ssl。SSLHandshakeException:太阳。安全验证器。ValidatorException:PKIX路径验证失败:java。安全cert.CertPathValidator异常:签名检查失败

每个spring boot应用程序都有自己的密钥库和自签名证书,存储在src/main/resources/keystore中。p12

...这是我在application.yml文件中的内容:以下属性:

server.ssl.key-store: classpath:keystore.p12
server.ssl.key-store-password: somethingsecure
server.ssl.keyStoreType: PKCS12
server.ssl.keyAlias: client or server (depending which .yml file your looking at)

我在Docker外面测试了这个,一切正常!我只是将API证书从kestore. p12文件导出,并将其导入到我的JRA cacerts文件中。

你可以从我的REST客户端Dockerfile中看到,我在那里做同样的事情:

FROM openjdk:8-jdk-alpine
EXPOSE 8443
WORKDIR /usr/src/app
COPY client.jar client.jar
COPY server.crt server.crt
RUN keytool -v -import -noprompt -alias server -file server.crt -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "client.jar"]

我已打开SSL调试,可以看到以下内容:

trustStore is: /usr/lib/jvm/java-1.8-openjdk/jre/lib/security/cacerts
trustStore type is : jks
trustStore provider is : 
init truststore

...

adding as trusted cert:
  Subject: CN=localhost, OU=Development, O=Microgen, L=Fleet, ST=Hampshire, C=UK
  Issuer:  CN=localhost, OU=Development, O=Microgen, L=Fleet, ST=Hampshire, C=UK
  Algorithm: RSA; Serial number: 0x4c1fbbc3
  Valid from Mon Apr 16 09:49:33 GMT 2018 until Tue Apr 16 09:49:33 GMT 2019

有什么想法吗?

谢谢

共有2个答案

葛威
2023-03-14

今天早上我终于弄明白了。服务器证书已损坏,并且自重新生成后,该操作正常。

微生令雪
2023-03-14

我不是专家,但在导出证书和导入时,我想知道在您的新位置,证书链是否与您获取证书的位置相同。

在原因部分下面有一个链接可以提供一些见解

https://confluence.atlassian.com/kb/connecting-to-ssl-services-802171215.html

 类似资料:
  • 我有一个小的springboot应用程序。我需要使用HTPPS,我从CA购买带有嵌入式tomcat的SSL证书。我试着配置它。应用财产: p、 12.使用keytool创建 **.我从加州得到的crt。我也有私钥,但不知道我需要在哪里使用它。 当我尝试启动此应用程序时,出现了一个错误 为什么应用程序看不到别名?我在keystore中看到了。 可能我需要一些其他设置来在springboot tomc

  • 我正在使用Spring引导应用程序连接MongoDB实例。我们已在MongoDB上启用了以下角色的身份验证 角色:[ { role: "dbOwner ",db: "{{ mongo.database_name }}" } 角色:[ { role: "readWrite ",db: "{{ mongo.database_name }}" } 我们使用conf文件提供凭证 数据: mongodb。u

  • 背景资料 我试图实现一个WAF字体的web应用程序托管在Azure应用程序服务。此应用程序被配置为强制https,因此WAF需要通过https流量(这里解释的端到端SSLhttps://docs.microsoft.com/en-us/azure/application-gateway/ssl-overview#end-to-end-ssl-encryption)。 我已通过Azure中的应用程序

  • 我的web应用程序和web服务运行在同一个tomcat容器中。如果我不使用HTTPS,则一切正常。 当我在HTTPS上运行web应用程序和web服务时,当web应用程序试图调用WebServices时,我将获得SSLHandshakeException。 我已经使用以下命令创建了本地自签名证书文件 已在文件夹中创建了名为的证书文件。 现在,我想用下面的命令在Java密钥库中导入这个证书 当我在To

  • 我使用docker compose在docker容器中运行SpringBoot应用程序,在另一个docker集装箱中运行另一个VueJS应用程序。yml如下: 我试图调用SpringBoot REST API从我的VueJS应用程序使用超文本传输协议://backend: 8080/hello和它失败GET超文本传输协议://backend: 8080/hello net::ERR_NAME_NO

  • 我想启用或禁用具有外部配置的SSL/TLS,这些配置可以在应用程序启动期间提供。应用程序应该支持http和HTTPS的所有crud操作。 既然上面的属性是不推荐使用的,那么我如何在不使用配置文件的情况下实现它。