У меня есть сертификат HTTPS, сгенерированный с помощью mkcert :
mkcert localhost 127.0.0.1 ::1 `hostname` discovery
Я строю архитектуру микросервисов на основе Spring с использованием Spring Boot, Eureka и Spring Cloud Config.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - это аргумент, необходимый для того, чтобы мои микросервисы при обращении к серверу конфигурации облака запрашивали имя моего компьютера вместо localhost.
Я преобразовал полученные .pem
иkey.pem
файлы в .p12
файл с использованием OpenSSL:
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?