如何正确地将自签名证书导入到默认情况下可用于所有Java应用程序的Java密钥库中?
我想将自签名证书导入到Java中,所以任何试图build立SSL连接的Java应用程序都会信任这个证书。
到目前为止,我设法导入它
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:PKIXpath构build失败:sun.security.provider.certpath.SunCertPathBuilderException:无法find有效的证书path到请求的目标
在Windows上 ,最简单的方法是使用程序portecle 。
- 下载并安装portecle。
- 首先让100%确定你知道使用哪个JRE或JDK来运行你的程序。 在64位的Windows 7上,可能有不lessJRE。 Process Explorer可以帮助你,或者你可以使用:
System.out.println(System.getProperty("java.home"));
- 将文件JAVA_HOME \ lib \ security \ cacerts复制到另一个文件夹。
- 在“Portecle”中单击“文件”>“打开密钥库文件”
- selectcacerts文件
- input这个密码:changeit
- 点击工具>导入可信证书
- 浏览文件mycertificate.pem
- 点击导入
- 单击确定以获取关于信任path的警告。
- 当显示有关证书的详细信息时,请单击确定。
- 单击是将该证书接受为可信。
- 当它询问一个别名时,点击确定,当它说已导入证书时,再次点击确定。
- 点击保存。 不要忘记这个或者这个改变被丢弃了。
- 将文件cacerts复制回您find它的地方。
在Linux上:
您可以从已经使用它的Web服务器下载SSL证书,如下所示:
$ echo -n | openssl s_client -connect www.example.com:443 | \ sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/examplecert.crt
可以selectvalidation证书信息:
$ 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
编辑:
现在我们通常不需要向密钥库添加证书,因为您可以从ssls.com获得每年5美元的证书。 以防万一这是你的select。
最后,我写了一个小的脚本,将证书添加到密钥库中,因此使用起来更容易。
您可以从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"
如果您使用由默认情况下未包含在Java cacerts文件中的证书颁发机构签署的证书,则需要为HTTPS连接完成以下configuration。 要将证书导入cacerts:
- 打开Windows资源pipe理器并导航到cacerts文件,该文件位于安装AX Core Client的jre \ lib \ security子文件夹中。 默认位置是C:\ Program Files \ ACL Software \ AX Core Client \ jre \ lib \ security
- 在进行任何更改之前创build文件的备份副本。
- 根据从您使用的证书颁发机构收到的证书,您可能需要将中间证书和/或根证书导入到cacerts文件中。 使用以下语法导入证书:keytool -import -alias -keystore -trustcacerts -file
- 如果您要导入两个证书,则为每个证书指定的别名应该是唯一的。
- 在“密码”提示符处input密钥库的密码,然后按Enter键。 cacerts文件的默认Java密码是“changeit”。 在“Trust this certificate?”提示符处input“y”,然后按Enter键。
这对我有效。 🙂
sudo keytool -importcert -file filename.cer -alias randomaliasname -keystore $ JAVA_HOME / jre / lib / security / cacerts -storepass changeit
可能想尝试
keytool -import -trustcacerts -noprompt -keystore <full path to cacerts> -storepass changeit -alias $REMHOST -file $REMHOST.pem
我真的不知道它把你的证书,如果你只写cacerts
只是给它一个完整的path
简单的命令“keytool”也适用于Windows和/或Cygwin。
如果您使用的是Cygwin ,则使用“S.Botha's”底部的修改命令:
- 确保你在JDK中标识你将要使用的JRE
- 以pipe理员身份启动您的提示/ cygwin
- 进入该JDK的bin目录,例如cd / cygdrive / c / Program \ Files / Java / jdk1.8.0_121 / jre / bin
-
从里面执行keytool命令,在那里你提供了新的Cert的path,就像这样:
./keytool.exe -import -trustcacerts -keystore ../lib/security/cacerts -storepass changeit -noprompt -alias myownaliasformysystem -file "D:\Stuff\saved-certs\ca.cert"
注意,因为如果这是在Cygwin下,你正在给一个非Cygwin程序的path,所以这个path类似于DOS,并用引号引起来。