我想导入自签名证书到Java,所以任何Java应用程序,将尝试建立一个SSL连接将信任此证书。
到目前为止,我设法将其导入
keytool -import -trustcacerts -noprompt -storepass changeit -alias $REMHOST -file $REMHOST.pem
keytool -import -trustcacerts -noprompt -keystore cacerts -storepass changeit -alias $REMHOST -file $REMHOST.pem
不过,当我尝试运行HTTPSClient.class
我仍然得到:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
在Windows上,最简单的方法是使用程序portecle 。
- 下载并安装portecle。
- 首先要100%确保你知道正在使用JRE或JDK来运行程序。 在64位Windows 7可能有不少的JRE。 进程资源管理器可以帮助你,或者你可以使用:
System.out.println(System.getProperty("java.home"));
- 文件JAVA_HOME \ lib \ security中\ cacerts中复制到另一个文件夹。
- 在Portecle单击文件>打开密钥存储文件
- 选择cacerts文件
- 输入此密码:的changeit
- 单击工具>导入信任证书
- 浏览文件mycertificate.pem
- 单击导入
- 点击确定有关信任路径警告。
- 单击确定,当它显示有关证书的详细信息。
- 单击以接受该证书作为可信的。
- 当它要求一个别名点击确定,然后再次单击确定,当它说,它已经导入的证书。
- 点击保存。 不要忘记这一点的变化或将被丢弃。
- 复制文件的cacerts回到原来的地方发现了它。
在Linux上:
您可以从一个已经使用它像这样一个Web服务器的SSL证书:
$ echo -n | openssl s_client -connect www.example.com:443 | \
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/examplecert.crt
可选验证证书信息:
$ openssl x509 -in /tmp/examplecert.crt -text
导入证书到Java的cacerts密钥库:
$ keytool -import -trustcacerts -keystore /opt/java/jre/lib/security/cacerts \
-storepass changeit -noprompt -alias mycert -file /tmp/examplecert.crt
编辑:
这些天来我们不经常有证书添加到密钥库,因为你可以得到每年5 $从证书ssls.com 。 以防万一,这是一个选择。
最后我写一个小脚本,将证书密钥库,所以它是非常容易使用。
您可以获取最新版本https://github.com/ssbarnea/keytool-trust
#!/bin/bash
# version 1.0
# https://github.com/ssbarnea/keytool-trust
REMHOST=$1
REMPORT=${2:-443}
KEYSTORE_PASS=changeit
KEYTOOL="sudo keytool"
# /etc/java-6-sun/security/cacerts
for CACERTS in /usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts \
/usr/lib/jvm/java-7-oracle/jre/lib/security/cacerts \
"/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/cacerts" \
"/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/MacOS/itms/java/lib/security/cacerts"
do
if [ -e "$CACERTS" ]
then
echo --- Adding certs to $CACERTS
# FYI: the default keystore is located in ~/.keystore
if [ -z "$REMHOST" ]
then
echo "ERROR: Please specify the server name to import the certificatin from, eventually followed by the port number, if other than 443."
exit 1
fi
set -e
rm -f $REMHOST:$REMPORT.pem
if openssl s_client -connect $REMHOST:$REMPORT 1>/tmp/keytool_stdout 2>/tmp/output </dev/null
then
:
else
cat /tmp/keytool_stdout
cat /tmp/output
exit 1
fi
if sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' </tmp/keytool_stdout > /tmp/$REMHOST:$REMPORT.pem
then
:
else
echo "ERROR: Unable to extract the certificate from $REMHOST:$REMPORT ($?)"
cat /tmp/output
fi
if $KEYTOOL -list -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT >/dev/null
then
echo "Key of $REMHOST already found, skipping it."
else
$KEYTOOL -import -trustcacerts -noprompt -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -file /tmp/$REMHOST:$REMPORT.pem
fi
if $KEYTOOL -list -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -keystore "$CACERTS" >/dev/null
then
echo "Key of $REMHOST already found in cacerts, skipping it."
else
$KEYTOOL -import -trustcacerts -noprompt -keystore "$CACERTS" -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -file /tmp/$REMHOST:$REMPORT.pem
fi
fi
done
```
D:\Java\jdk1.5.0_10\bin\keytool -import -file "D:\Certificates\SDS services\Dev\dev-sdsservices-was8.infavig.com.cer" -keystore "D:\Java\jdk1.5.0_10\jre\lib\security\cacerts" -alias "sds certificate"
这为我工作。 :)
sudo keytool -importcert -file filename.cer -alias randomaliasname -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit
如果您使用的是不包括在默认情况下的Java cacerts文件证书颁发机构签发的证书,需要完成对HTTPS连接下面的配置。 要证书导入到cacerts中:
- 打开Windows资源管理器,然后导航到cacerts文件,它位于在安装AX核心客户中的jre \ lib \ security中的子文件夹。 默认位置为C:\ Program Files文件\ ACL软件\ AX核心客户\ JRE \ lib \ security中
- 在进行任何更改之前创建文件的备份副本。
- 根据您从证书颁发机构使用的是接收证书,您可能需要导入中间证书和/或根证书到cacerts文件。 使用下面的语法来导入证书:keytool的-import -alias -keystore -trustcacerts -file
- 如果您正在导入两个证书每个证书指定的别名应该是唯一的。
- 在“密码”的提示,然后按Enter键键入密钥库的密码。 默认的Java密码cacerts文件是“的changeit”。 键入“Y”在“信任此证书?”的提示,然后按Enter。
简单的命令“密钥工具”也适用于Windows和/或使用Cygwin。
如果你使用Cygwin这里是我从“S.Botha的”答案底部使用了修改后的命令:
- 确保你确定你要使用的JDK里面的JRE
- 启动您提示/ Cygwin的为管理员
- 走这JDK如,cd / cygdrive / C /程序\文件/的Java / jdk1.8.0_121 / JRE / bin中的bin目录内
执行从里面的密钥工具命令,你提供的路径,你的新证书末,就像这样:
./keytool.exe -import -trustcacerts -keystore ../lib/security/cacerts -storepass changeit -noprompt -alias myownaliasformysystem -file "D:\Stuff\saved-certs\ca.cert"
请注意,因为如果这是在Cygwin下你给一个非Cygwin的程序路径,这样的路径,像DOS和报价。
可能想尝试
keytool -import -trustcacerts -noprompt -keystore <full path to cacerts> -storepass changeit -alias $REMHOST -file $REMHOST.pem
老实说,我不知道它把你的证书,如果你只写cacerts
只是给它一个完整的路径
在Java中的Linux安装证书
/选择/ JDK(版本)/斌/ keytool的-import -alias -file aliasname的-keystore certificate.cer的cacerts -storepass密码
文章来源: How to properly import a selfsigned certificate into Java keystore that is available to all Java applications by default?