Dockerfile键工具:获取;证书别名<;名称>;“已经存在”;甚至使用;keytool-删除";

Dockerfile键工具:获取;证书别名<;名称>;“已经存在”;甚至使用;keytool-删除";,docker,https,keytool,Docker,Https,Keytool,我使用Dockerfile为需要HTTPS的web应用程序创建图像。但是,我正在获取未导入的证书,别名已存在Java异常。当我尝试不使用Dockerfile时,仅在命令行中,我就可以删除现有别名并导出,import。但不能使用Dockerfile。有什么想法吗?谢谢 Dockerfile: FROM openjdk:8-alpine #Starting https and certs configuration #Make directory for certs inside th

我使用
Dockerfile
为需要
HTTPS
的web应用程序创建图像。但是,我正在获取未导入的
证书,别名已存在
Java异常。当我尝试不使用
Dockerfile
时,仅在命令行中,我就可以删除现有别名并导出
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 .
环境:

提前谢谢

我更喜欢符号:

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
是a)

但要点是:

  • 您可以在
    my cert name.jks
    中删除,而在
    trustStore.jks
    中导入
  • 如果导入失败,这意味着
    trustStore.jks
    已经拥有该名称的证书
如果该证书已在复制的密钥库中,我将不会导出/重新导入它。(我只在中国进口)

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

委员会确认:

我应该从
trustStore.jks
中删除现有别名,而不是
我的证书名.jks


基本图像是什么?(你的Dockerfile的第一行:FROM行)嗨,我添加了Dockerfile。希望你现在能看到。谢谢谢谢你,沃克!我用你建议的符号更新了我的问题。当你说“我不会导出/重新导入它(我在上一个回答中只导入了它)”时。你能再解释一下吗?如何检查别名是否已存在?如果它在那里,如果我想用一个新的但有相同别名的更新它怎么办?谢谢@丰丰“我在之前的回答中只导入了它”:那么为什么我会看到“keytool-export”?这不是一个导出吗?根据我收到的指令,它首先执行
-export
,然后执行
-importcert
。让我找出原因。另一个问题,我看到人们将证书复制到
$JAVA\u HOME/jre/lib/security
然后进行导入,证书(.jks)是否必须是
$JAVA\u HOME/jre/lib/security
?不,是吗?我能够在
myWebApp/src/main/resources/PT/certificates/
目录下本地运行这些命令,我的java是jdk1.8。有什么想法吗?谢谢@如果您想让任何java进程知道您的证书,那么是的,您需要修改
$JAVA_HOME/jre/lib/security/cacerts
密钥库文件。因此,我需要执行此操作
#将证书从本地复制到容器复制myWebApp/src/main/resources/PT/certificates/my-cert-name.jks/etc/ssl/certs/JAVA/cacerts复制myWebApp/src/main/resources/PT/certificates/trustStore.jks/etc/ssl/certs/java/cacerts
是否改用
/etc/ssl/certs/java/cacerts
目录?谢谢
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