【问题标题】:Dockerfile keytool: getting "Certificate alias <name> already exists" even using "keytool - delete"Dockerfile keytool:即使使用“keytool - 删除”,也会得到“证书别名 <name> 已经存在”
【发布时间】:2020-02-16 22:36:32
【问题描述】:

我使用Dockerfile 为需要HTTPS 的网络应用创建图像。但是,我收到Certificate not imported, alias &lt;my-cert-name&gt; already exists Java 异常。当我尝试不使用Dockerfile 时,仅从命令行中,我能够删除现有别名并且exportimport 工作。但不是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. 

提前致谢!

【问题讨论】:

  • 什么是基础镜像? (你的 Dockerfile 的第一行:FROM 行)
  • 您好 VonC,我添加了 Dockerfile。希望你现在能看到。谢谢!

标签: docker https keytool


【解决方案1】:

我更喜欢这个符号:

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 已经拥有该名称的证书

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

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

OP fongfong 确认in the comments

我应该从trustStore.jks 中删除现有别名,而不是my-cert-name.jks

【讨论】:

  • 谢谢 VonC!我使用您建议的符号更新了我的问题。当您说“我不会导出/重新导入它。(我只在我之前的回答中导入它)”。你能再解释一下吗?如何检查别名是否已经存在?如果它在那里,如果我想用新的更新它但具有相同的别名怎么办?谢谢!
  • @fongfong “我只在之前的回答中导入了它”:那为什么我会看到“keytool -export”?不是出口吗?
  • 根据我提供的指令,它首先执行-export,然后执行-importcert。让我找出原因。另一个问题,我看到人们将证书复制到$JAVA_HOME/jre/lib/security 然后进行导入,证书(.jks)是否必须是$JAVA_HOME/jre/lib/security?没有权利?我能够在myWebApp/src/main/resources/PT/certificates/ 目录下本地运行这些命令,我​​的java 是jdk1.8。对此有什么想法吗?谢谢!
  • @fongfong 如果您希望任何 java 进程知道您的证书,那么是的,您需要修改 $JAVA_HOME/jre/lib/security/cacerts 密钥库文件。
  • 所以我需要使用/etc/ssl/certs/java/cacerts 目录来代替#Copy certs from local to the container COPY myWebApp/src/main/resources/PT/certificates/my-cert-name.jks /etc/ssl/certs/java/cacerts COPY myWebApp/src/main/resources/PT/certificates/trustStore.jks /etc/ssl/certs/java/cacerts 吗?谢谢!
猜你喜欢
  • 2018-06-20
  • 2016-11-09
  • 1970-01-01
  • 2018-01-09
  • 2017-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 2016-06-27
相关资源
最近更新 更多