Dockerfile keytool:即使使用 "keytool - delete" 也得到 "Certificate alias <name> already exists"
Dockerfile keytool: getting "Certificate alias <name> already exists" even using "keytool - delete"
我使用 Dockerfile
为需要 HTTPS
的网络应用创建图像。但是,我收到 Certificate not imported, alias <my-cert-name> already exists
Java 异常。当我在不使用 Dockerfile
的情况下仅从命令行尝试时,我能够删除现有的别名并且 export
、import
起作用了。但不是 Dockerfile
。有任何想法吗?谢谢!
Docker文件:
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
更容易仔细检查您导入的是与您删除的名称相同的名称。
(因为 -delete
是 good way to force update an existing certificate)
但要点是:
- 您在
my-cert-name.jks
中删除,而在 trustStore.jks
中导入。
- 如果导入失败,这意味着
trustStore.jks
已经拥有该名称的证书
如果该证书已经在复制的密钥库中,我不会export/re-import它。 (我只在导入了它)
确保“usr/app/ssl/certs
”是正确的路径:我宁愿使用绝对路径,也不愿使用相对路径。
OP fongfong confirms :
I should delete the existing alias from trustStore.jks
, not my-cert-name.jks
我使用 Dockerfile
为需要 HTTPS
的网络应用创建图像。但是,我收到 Certificate not imported, alias <my-cert-name> already exists
Java 异常。当我在不使用 Dockerfile
的情况下仅从命令行尝试时,我能够删除现有的别名并且 export
、import
起作用了。但不是 Dockerfile
。有任何想法吗?谢谢!
Docker文件:
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
更容易仔细检查您导入的是与您删除的名称相同的名称。
(因为 -delete
是 good way to force update an existing certificate)
但要点是:
- 您在
my-cert-name.jks
中删除,而在trustStore.jks
中导入。 - 如果导入失败,这意味着
trustStore.jks
已经拥有该名称的证书
如果该证书已经在复制的密钥库中,我不会export/re-import它。 (我只在
确保“usr/app/ssl/certs
”是正确的路径:我宁愿使用绝对路径,也不愿使用相对路径。
OP fongfong confirms
I should delete the existing alias from
trustStore.jks
, notmy-cert-name.jks