【发布时间】:2018-10-02 15:42:10
【问题描述】:
我有两个 Spring Boot 应用程序,每个应用程序都在各自的 docker 容器中运行。
一个是REST Client,另一个是REST API。
当客户端调用 API(即GET https://localhost:8443/api/someResource)时,我收到以下错误:
原因:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX 路径验证失败:java.security.cert.CertPathValidatorException:签名检查失败
每个 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 证书从 keystore.p12 文件中导出,然后将其导入到我的 JRA cacerts 文件中。
你可以从我的 REST Client 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
有什么想法吗?
谢谢,
本
【问题讨论】:
-
匹配使用的主机名证书中的名称?
-
是的,证书中的CN是localhost,REST Client调用localhost:8443/api/blahblahblah
标签: java spring docker tomcat https