Dockerfile keytool: получение «Псевдоним сертификата <name>уже существует» даже с использованием «keytool - delete» - PullRequest
1 голос
/ 17 февраля 2020

Я использую Dockerfile, чтобы создать изображение для нашего веб-приложения, для которого требуется HTTPS. Тем не менее, я получаю Certificate not imported, alias <my-cert-name> already exists Java исключение. Когда я попытался без использования Dockerfile, просто из командной строки, я смог удалить существующий псевдоним и export, import сработало. Но не с Dockerfile. Любые идеи? Спасибо!

Dockerfile:

  FROM openjdk:8-alpine

  #Starting https and certs configuration
  #Make directory for certs inside the container
  RUN mkdir -p usr/app/ssl/certs/

  #Copy certs from local to the container
  COPY myWebApp/src/main/resources/PT/certificates/my-cert-name.jks usr/app/ssl/certs/
  COPY myWebApp/src/main/resources/PT/certificates/trustStore.jks usr/app/ssl/certs/

  #Export/Import certificate 
  RUN cd usr/app/ssl/certs/ && \
      keytool -delete -alias my-cert-name -keystore my-cert-name.jks -storepass password123! && \
      keytool -export -alias my-cert-name -keystore my-cert-name.jks -file my-cert-name.crt -storepass password123! && \
      keytool -importcert -keystore trustStore.jks -alias my-cert-name -storepass password123! -file my-cert-name.crt -noprompt
  #Ending https and certs configuration

  RUN mkdir -p /usr/app/myweb

  COPY myWebApp/target/myWeb.war /usr/app/myweb

  CMD java -Xms512M -Xmx6144M -XX:MaxMetaspaceSize=3072M -jar /usr/app/myweb/myWeb.war
  EXPOSE 8080

Docker команда построения

  >docker build -it test-https-image .

Env:

 Using Docker desktop on windows 10. 

Заранее спасибо!

1 Ответ

1 голос
/ 17 февраля 2020

Я предпочитаю запись:

RUN cd usr/app/ssl/certs/ && \
    keytool -delete -alias my-cert-name -keystore my-cert-name.jks -storepass password123! && \
    keytool -export -alias my-cert-name -keystore my-cert-namet.jks \
      -file my-cert-name.crt -storepass password123! && \
    keytool -importcert -keystore trustStore.jks -alias my-cert-name -storepass password123! \
      -file my-cert-name.crt -noprompt

Проще проверить, импортируете ли вы то же имя, которое вы удалили.
(поскольку -delete - это хороший способ принудительно обновить существующий сертификат )

Но суть:

  • вы удаляете в my-cert-name.jks, а вы импортируете в trustStore.jks.
  • в случае сбоя импорта, это означает, что trustStore.jks уже имеет сертификат для этого имени

Если этот сертификат был уже в скопированном хранилище ключей, я бы не экспортировать / реимпортировать его. (Я импортировал его только в мой предыдущий ответ )

Убедитесь, что "usr/app/ssl/certs" - правильный путь: я бы предпочел использовать абсолютный путь, а не относительный путь.

Фонфон OP подтверждает в комментариях :

Я должен удалить существующий псевдоним из trustStore.jks, а не my-cert-name.jks

...