Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在docker中为Java应用程序添加许多SSL证书?_Java_Docker_Ssl Certificate_Dockerfile - Fatal编程技术网

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

如何在docker中为Java应用程序添加许多SSL证书?,java,docker,ssl-certificate,dockerfile,Java,Docker,Ssl Certificate,Dockerfile,我是新来的码头工人。我想在Docker中为Java应用程序添加几个证书。我在Dockerfile中使用以下代码: RUN keytool -importcert -noprompt -trustcacerts -alias artifactory -file /files/cert.crt -keystore local -storepass changeit 它运行良好,但只适用于一个证书。如何使用一行命令或某个周期或bash文件从/files文件夹添加所有证书 更新:我使用next bas

我是新来的码头工人。我想在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命令时,它可以正常工作。

您可以创建密钥库。但建议使用默认密钥库。 默认密钥库路径:
\appserver\domains\\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);
第一个参数是密钥别名,第二个参数是证书密钥,第三个参数是密码

阅读更多:

我知道,您希望自动导入多个证书。可以通过使用bash在文件上循环来实现这一点

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

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

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

如果您已经完成,您可以使导入脚本可用,例如通过符号链接,并让docker运行上述命令。

在dockerfile call 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

下载证书

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
有关完整步骤,请参阅:

我在这里看到了如何只添加一个文件。但我的问题是如何以一种简单的方式添加多个文件-命令行或循环。是否希望以编程方式进行添加?无论如何。如果没有简单的命令,它可能是通过编程实现的。我已经编辑了我的答案并添加了编程代码。试试看。在构建计算机上安装jdk/jre,它有keytool可执行文件。Java已经安装。我可以在docker容器中手动运行keytool。但是,当我试图通过bash执行此操作时,我得到了错误。也许bash文件中的语法是错误的,很可能是路径问题。在终端中尝试
哪个keytool
,找出可执行文件的位置。您对java的认识是正确的。我仔细检查了我的代码,发现java是在bash代码调用之后安装的。很高兴看到你的问题得到了解决,并且与社区分享了你自己的解决方案。你的方法和我的建议很相似,如果有人能帮你解决问题的话,你最好竖起大拇指。