我是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时,它工作正常。
答案 0 :(得分:0)
您可以创建一个密钥库。但是建议使用默认的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
答案 1 :(得分:0)
我了解,您想自动导入多个证书。您可以通过使用bash遍历文件来实现。
如此处所述,您可以通过查找来搜索文件,然后处理结果。
How to loop through file names returned by find?
为此,您可以在自己的bash脚本中编写keytool命令的代码,然后将find命令的结果发送到脚本中,例如
find . -name *.crt -print0 | xargs -0 myImportScript.sh
如果您已完成此操作,则可以使导入脚本可用,例如通过符号链接,让docker运行上面的命令。
答案 2 :(得分:0)
在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
答案 3 :(得分: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/