我是码头工人的新手。我想在 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 时,它工作正常。
在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
我理解,您希望自动导入多个证书。您可以通过使用 bash 循环文件来完成此操作。
如此处所述,您可以通过查找来搜索文件,然后处理结果。
为此,您可以在自己的 bash 脚本中编写 keytool 命令,并将 find 命令的结果发送到您的脚本,例如
find . -name *.crt -print0 | xargs -0 myImportScript.sh
如果您已完成此操作,则可以使导入脚本可用,例如通过符号链接,让 docker 运行上面的命令。
您可以创建一个密钥库。但建议使用默认的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
下载证书
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/