你可以使用keytool
你的 Java 安装,它应该在$JAVA_HOME/bin
. Java 密钥库位于$JAVA_HOME/lib/security/cacerts
或$JAVA_HOME/jre/lib/security/cacerts
取决于您是否安装了 JDK 或 JRE。
如果使用 Java 9 或更高版本,则无需知道确切位置。您可以将该-cacerts
选项用作快捷方式。
Java 9+
因此,对于 Java 9(又名 Java 1.9)或更高版本,只需使用
keytool -importcert -trustcacerts -cacerts -file myCert.pem -alias myCert
早期的 Java 版本
对于 Java 8(又名 1.8)或更早版本,您必须像这样指定密钥库位置
keytool -importcert -trustcacerts -keystore $JAVA_HOME/lib/security/cacerts -file myCert.pem -alias myCert
对于 Java 5(又名 1.5)或更早版本,该-importcert
选项不存在。它被称为-import
,但除此之外它是相同的。所以使用
keytool -import -trustcacerts -keystore $JAVA_HOME/lib/security/cacerts -file myCert.pem -alias myCert
附加选项
- 您将被要求输入信任库密码,默认密码是changeit。
- 如果需要在无人值守的情况下运行导入,可以添加
-storepass changeit -noprompt
格式
keytool
可以导入 X.509 v1、v2 和 v3 证书,以及由该类型 (P7B) 证书组成的 PKCS#7 格式证书链。必须提供要导入的数据
- 采用二进制编码格式 (DER)
- 或以可打印的编码格式(又名 base64 编码),包含在
-----BEGIN
和-----END
行(PEM)中
注意:我不确定 PEM 格式的证书链是否真的有效。
奖金脚本
恐怕,它是 bash,所以对于 Windows 用户没有解决方案。
这个简单的脚本是由 stackoverflow 上的几个有用的问题和聪明的答案创建的,它检查 Java 版本并 - 如有必要 - 确定正确的密钥库位置,并且它可以在一个命令中导入多个证书。请注意,您必须在单引号中传递文件模式参数(请参阅用法)。
addcerts.sh
#!/bin/bash
# Add custom root certificates to Java trust store
if [ "$#" -ne 1 ]; then
SCRIPT=`basename "$0"`
echo "Usage: $SCRIPT 'path/to/certs/*'"
exit 1
fi
CERTFILES=$1
JAVA_VERSION=`java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1`
if (( $JAVA_VERSION >= 9 )); then
CACERTS="-cacerts"
else
# Check where cacerts are located
# differs depending or jdk or jre installed
if [ -d "$JAVA_HOME/jre" ]; then
CACERTS="$JAVA_HOME/jre"
else
CACERTS="$JAVA_HOME"
fi
CACERTS="-keystore $CACERTS/lib/security/cacerts"
fi
# Now add certificates
for CERTFILE in $CERTFILES; do
# Remove path, then suffix to derive alias from filename
ALIAS=${CERTFILE##*/}
ALIAS=${ALIAS%.*}
$JAVA_HOME/bin/keytool -importcert -file "$CERTFILE" -alias "$ALIAS" $CACERTS -trustcacerts -storepass changeit -noprompt
if [ $? -ne 0 ]; then
echo "Failed to add $CERTFILE as $ALIAS to $CACERTS"
exit 1
fi
done