Dockerfile keytool : getting "Certificate alias <name> already exists" even using "keytool - delete"

标签 docker https keytool

我使用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 .

环境:

 Using Docker desktop on windows 10. 

提前致谢!

最佳答案

我更喜欢这种表示法:

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

更容易仔细检查您是否正在导入已删除的相同名称。
(因为 -deletegood way to force update an existing certificate )

但要点是:

  • 您在 my-cert-name.jks 中删除,同时在 trustStore.jks 中导入。
  • 如果导入失败,则意味着 trustStore.jks 已拥有该名称的证书

如果该证书已经在复制的 keystore 中,我不会导出/重新导入它。 (我只在 my previous answer 中导入过)

确保“usr/app/ssl/certs”是正确的路径:我宁愿使用绝对路径,而不是相对路径。

OP fongfong确认in the comments :

I should delete the existing alias from trustStore.jks, not my-cert-name.jks

关于Dockerfile keytool : getting "Certificate alias <name> already exists" even using "keytool - delete",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60253847/

相关文章:

docker - 如何使用Terraform将ulimit参数传递给Docker?

docker - asp.net core 2.0 - 多项目解决方案docker文件

apache - 如何在本地 JSP 网站上实现 SSL/HTTPS?

ios - 在 iOS 9 中使用自签名证书发出 HTTPS 请求

java - 在 keystore 文件中查找别名

java - 我可以使用证书存储中的现有证书签署 JAR 文件吗?

java - 如何将 p7s 证书链导入 keystore ?

java - 从头开始为 JRE 创建 Docker 镜像

linux - Docker Bash 提示不显示颜色输出

apache - 如何结合基本身份验证和https?