在Docker容器之间信任HTTPS证书

时间:2019-03-05 00:00:34

标签: spring spring-boot docker spring-cloud spring-cloud-netflix

我有一个用mkcert生成的HTTPS证书:

mkcert localhost 127.0.0.1 ::1 `hostname` discovery

我正在使用Spring Boot,Eureka和Spring Cloud Config构建基于Spring的微服务架构。

hostname是必需的参数,因为与云配置服务器通信时,我的微服务会向我的计算机名称而不是本地主机发出请求。

我使用OpenSSL将生成的.pemkey.pem文件转换为.p12文件:

openssl pkcs12 -export -in localhost.pem -inkey localhost-key.pem -out keystore.p12 -name bootifulsecurity

如果设置了许多环境变量,我可以使用HTTPS运行所有应用程序。

export SERVER_SSL_ENABLED=true
export SERVER_SSL_KEY_STORE=../keystore.p12
export SERVER_SSL_KEY_STORE_PASSWORD=CL1649GH
export SERVER_SSL_KEY_ALIAS=bootifulsecurity
export SERVER_SSL_KEY_STORE_TYPE=PKCS12

这很好用,在每个微服务中设置以下属性后,我就可以在服务之间进行通信。

server.port=8080
eureka.instance.secure-port-enabled=true
eureka.instance.secure-port=${server.port}

现在,我想在Docker Compose中运行它。对于每个看起来像这样的项目,我都有一个Dockerfile

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/*.jar app.jar
ADD keystore.p12 keystore.p12
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ] 

我为.env中的每个服务使用一个docker-compose.yml文件,为每个服务设置相同的环境变量。

SERVER_SSL_ENABLED=true
SERVER_SSL_KEY_STORE=keystore.p12
SERVER_SSL_KEY_STORE_PASSWORD=<hidden>
SERVER_SSL_KEY_ALIAS=bootifulsecurity
SERVER_SSL_KEY_STORE_TYPE=PKCS12

当我开始一切时,我可以从浏览器访问每个端点,证明HTTPS证书适用于Spring Boot。但是,每当我的服务尝试在Eureka(在https://discovery:8761/eureka处注册时,我都会在日志中看到以下内容。

Caused by: sun.security.validator.ValidatorException: PKIX path building 
failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to 
find valid certification path to requested target

我尝试将keytool用作Dockerfile的一部分,但这似乎无法解决问题。

ADD localhost.pem $JAVA_HOME/jre/lib/security
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
RUN \
    cd $JAVA_HOME/jre/lib/security \
    && keytool -keystore cacerts -storepass CL1649GH -noprompt -trustcacerts -importcert \
    -alias bootifulsecurity -file localhost.pem

我还尝试了从.pem.crt的转换,并以此方式进行了更新:

ADD localhost.crt /usr/local/share/ca-certificates/localhost.crt
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
RUN update-ca-certificates

这也不能解决问题。知道如何允许Docker映像通过HTTPS相互交谈吗?

0 个答案:

没有答案