【问题标题】:How to add many SSL certificates for Java application inside docker?如何在 docker 中为 Java 应用程序添加许多 SSL 证书?
【发布时间】:2019-06-03 08:57:39
【问题描述】:

我是 docker 新手。我想在 Docker 中为 Java 应用程序添加几个证书。我在 Dockerfile 中使用此代码:

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

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

更新:我使用下一个 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 时,它可以正常工作。

【问题讨论】:

  • 在构建计算机上安装 jdk/jre,它有 keytool 可执行文件。
  • Java 已安装。我可以在 docker 容器中手动运行 keytool。但是当我尝试通过 bash 执行此操作时,我得到了错误。可能是 bash 文件中的语法错误。
  • 很可能是路径问题。在终端尝试which keytool,找出可执行文件的位置。
  • 你对 java 的看法是对的。我仔细检查了我的代码,发现在调用 bash 代码之后安装了 java。它现在正在工作。

标签: java docker ssl-certificate dockerfile


【解决方案1】:

在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

【讨论】:

  • 很高兴看到您的问题得到解决并与社区分享您自己的解决方案。您的方法与我的建议相似,如果对您的问题有帮助,请点赞。
【解决方案2】:

我了解,您希望自动导入多个证书。您可以通过使用 bash 遍历文件来实现。

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

How to loop through file names returned by find?

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

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

如果你已经完成了,你可以使导入脚本可用,例如通过符号链接,让 docker RUN 上面的命令。

【讨论】:

    【解决方案3】:

    您可以创建一个密钥库。但建议使用默认的 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

    【讨论】:

    • 我在这里看到了如何只添加一个文件。但我的问题是如何以简单的方式添加多个文件 - 命令行或循环。
    • 你想以编程方式进行吗?
    • 无论如何。如果没有简单的命令,它可能是程序化的。
    • 我已经编辑了我的答案并添加了程序代码。试试看。
    【解决方案4】:

    下载证书

    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/

    【讨论】:

      猜你喜欢
      • 2018-04-06
      • 1970-01-01
      • 2022-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      相关资源
      最近更新 更多