如何在docker内为Java应用程序添加多个SSL证书?

问题描述 投票:0回答:4

我是码头工人的新手。我想在 Docker 内为 Java 应用程序添加多个证书。我在 Dockerfile 中使用此代码:

RUN keytool -importcert -noprompt -trustcacerts -alias artifactory -file /files/cert.crt -keystore local -storepass changeit

它工作正常,但只能用于一张证书。如何使用一行命令或在某个周期或使用 bash 文件添加 /files 文件夹中的所有证书?

更新:我使用 next bash 添加证书:

for cert in ${tempdir}/*.crt; do
cert2=$(basename $cert)
echo "# ${cert2}" >> ${destdir}/${cert2}
${openssl} x509 -inform der -in ${cert} -outform pem -out ${destdir}/${cert2}
keytool -importcert -noprompt -trustcacerts -alias artifactory -file /${destdir}/${cert2} -keystore local -storepass changeit
done

但出现下一个错误:“keytool:找不到命令”。当我在 docker 容器中运行命令 keytool 时,它工作正常。

java bash docker dockerfile ssl-certificate
4个回答
4
投票

在dockerfile中调用bash文件:

RUN apk update && apk add bash openssl wget && rm -rf /var/cache/apk/*
COPY getcerts.sh getcerts.sh
RUN chmod +x getcerts.sh && ./getcerts.sh

Bash 脚本:

for cert in ${tempdir}/*.crt; do
keytool -importcert -noprompt -trustcacerts -alias artifactory-${cert2} -file /${destdir}/${cert2} -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit
done

1
投票

我理解,您希望自动导入多个证书。您可以通过使用 bash 循环文件来完成此操作。

如此处所述,您可以通过查找来搜索文件,然后处理结果。

如何循环查找find返回的文件名?

为此,您可以在自己的 bash 脚本中编写 keytool 命令,并将 find 命令的结果发送到您的脚本,例如

find . -name *.crt -print0 | xargs -0 myImportScript.sh

如果您已完成此操作,则可以使导入脚本可用,例如通过符号链接,让 docker 运行上面的命令。


1
投票

您可以创建一个密钥库。但建议使用默认的KeyStore。 默认密钥库路径:

<c:\JavaCAPS>\appserver\domains\<MyDomain>\config\keystore.jks

但如果您需要,您可以创建一个密钥库。

生成 Java 密钥库和密钥对

keytool -genkey -alias mydomain -keyalg RSA -keystore keystore.jks -keysize 2048

将根或中间 CA 证书导入到现有 Java 密钥库

keytool -import -trustcacerts -alias root -file Thawte.crt -keystore keystore.jks

将签名的主证书导入到现有的 Java 密钥库

keytool -import -trustcacerts -alias mydomain -file mydomain.crt -keystore keystore.jks

以编程方式保存对称密钥

KeyStore.SecretKeyEntry secret = new KeyStore.SecretKeyEntry(secretKey);
KeyStore.ProtectionParameter password = new KeyStore.PasswordProtection(pwdArray);
ks.setEntry("db-encryption-secret", secret, password);

第一个参数是密钥别名,第二个参数是证书密钥,第三个参数是密码。

阅读更多: https://docs.oracle.com/cd/E19509-01/820-3503/ggfen/index.html https://www.sslshopper.com/article-most-common-java-keytool-keystore-commands.html


0
投票

下载证书

echo | openssl s_client -servername NAME -connect www.google.com:443 |\
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > gcert.crt

复制到 Docker:

docker cp SRC_PATH CONTAINER:DEST_PATH

导入到 Java 密钥库:

keytool -import -alias www.google.com -file CERT_FILE_PATH -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit -trustcacerts

完整步骤请参考: http://muralitechblog.com/import-ssl-certificate-into-java-keystore/

© www.soinside.com 2019 - 2024. All rights reserved.