我有一个用mkcert生成的HTTPS证书:
mkcert localhost 127.0.0.1 ::1 `hostname` discovery
我正在使用Spring Boot,Eureka和Spring Cloud Config构建基于Spring的微服务架构。
hostname
是必需的参数,因为与云配置服务器通信时,我的微服务会向我的计算机名称而不是本地主机发出请求。
我使用OpenSSL将生成的.pem
和key.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相互交谈吗?