如何正确地将自签名证书导入到默认情况下可用于所有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 。

  1. 下载并安装portecle。
  2. 首先让100%确定你知道使用哪个JRE或JDK来运行你的程序。 在64位的Windows 7上,可能有不lessJRE。 Process Explorer可以帮助你,或者你可以使用: System.out.println(System.getProperty("java.home"));
  3. 将文件JAVA_HOME \ lib \ security \ cacerts复制到另一个文件夹。
  4. 在“Portecle”中单击“文件”>“打开密钥库文件”
  5. selectcacerts文件
  6. input这个密码:changeit
  7. 点击工具>导入可信证书
  8. 浏览文件mycertificate.pem
  9. 点击导入
  10. 单击确定以获取关于信任path的警告。
  11. 当显示有关证书的详细信息时,请单击确定。
  12. 单击是将该证书接受为可信。
  13. 当它询问一个别名时,点击确定,当它说已导入证书时,再次点击确定。
  14. 点击保存。 不要忘记这个或者这个改变被丢弃了。
  15. 将文件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:

  1. 打开Windows资源pipe理器并导航到cacerts文件,该文件位于安装AX Core Client的jre \ lib \ security子文件夹中。 默认位置是C:\ Program Files \ ACL Software \ AX Core Client \ jre \ lib \ security
  2. 在进行任何更改之前创build文件的备份副本。
  3. 根据从您使用的证书颁发机构收到的证书,您可能需要将中间证书和/或根证书导入到cacerts文件中。 使用以下语法导入证书:keytool -import -alias -keystore -trustcacerts -file
  4. 如果您要导入两个证书,则为每个证书指定的别名应该是唯一的。
  5. 在“密码”提示符处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”底部的修改命令:

  1. 确保你在JDK中标识你将要使用的JRE
  2. 以pipe理员身份启动您的提示/ cygwin
  3. 进入该JDK的bin目录,例如cd / cygdrive / c / Program \ Files / Java / jdk1.8.0_121 / jre / bin
  4. 从里面执行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,并用引号引起来。