Доверие HTTPS-сертификатам между Docker-контейнерами - PullRequest
0 голосов
/ 05 марта 2019

У меня есть сертификат 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?

...