如何正确导入自签名证书导入Java密钥库,可用于在默认情况下所有的Java应用程序?(How to

2019-06-17 12:18发布

我想导入自签名证书到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

Answer 1:

在Windows上,最简单的方法是使用程序portecle 。

  1. 下载并安装portecle。
  2. 首先要100%确保你知道正在使用JRE或JDK来运行程序。 在64位Windows 7可能有不少的JRE。 进程资源管理器可以帮助你,或者你可以使用: System.out.println(System.getProperty("java.home"));
  3. 文件JAVA_HOME \ lib \ security中\ cacerts中复制到另一个文件夹。
  4. 在Portecle单击文件>打开密钥存储文件
  5. 选择cacerts文件
  6. 输入此密码:的changeit
  7. 单击工具>导入信任证书
  8. 浏览文件mycertificate.pem
  9. 单击导入
  10. 点击确定有关信任路径警告。
  11. 单击确定,当它显示有关证书的详细信息。
  12. 单击以接受该证书作为可信的。
  13. 当它要求一个别名点击确定,然后再次单击确定,当它说,它已经导入的证书。
  14. 点击保存。 不要忘记这一点的变化或将被丢弃。
  15. 复制文件的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 。 以防万一,这是一个选择。



Answer 2:

最后我写一个小脚本,将证书密钥库,所以它是非常容易使用。

您可以获取最新版本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

```



Answer 3:

    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"


Answer 4:

这为我工作。 :)

sudo keytool -importcert -file filename.cer -alias randomaliasname -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit 


Answer 5:

如果您使用的是不包括在默认情况下的Java cacerts文件证书颁发机构签发的证书,需要完成对HTTPS连接下面的配置。 要证书导入到cacerts中:

  1. 打开Windows资源管理器,然后导航到cacerts文件,它位于在安装AX核心客户中的jre \ lib \ security中的子文件夹。 默认位置为C:\ Program Files文件\ ACL软件\ AX核心客户\ JRE \ lib \ security中
  2. 在进行任何更改之前创建文件的备份副本。
  3. 根据您从证书颁发机构使用的是接收证书,您可能需要导入中间证书和/或根证书到cacerts文件。 使用下面的语法来导入证书:keytool的-import -alias -keystore -trustcacerts -file
  4. 如果您正在导入两个证书每个证书指定的别名应该是唯一的。
  5. 在“密码”的提示,然后按Enter键键入密钥库的密码。 默认的Java密码cacerts文件是“的changeit”。 键入“Y”在“信任此证书?”的提示,然后按Enter。


Answer 6:

简单的命令“密钥工具”也适用于Windows和/或使用Cygwin。

如果你使用Cygwin这里是我从“S.Botha的”答案底部使用了修改后的命令:

  1. 确保你确定你要使用的JDK里面的JRE
  2. 启动您提示/ Cygwin的为管理员
  3. 走这JDK如,cd / cygdrive / C /程序\文件/的Java / jdk1.8.0_121 / JRE / bin中的bin目录内
  4. 执行从里面的密钥工具命令,你提供的路径,你的新证书末,就像这样:

     ./keytool.exe -import -trustcacerts -keystore ../lib/security/cacerts -storepass changeit -noprompt -alias myownaliasformysystem -file "D:\Stuff\saved-certs\ca.cert" 

请注意,因为如果这是在Cygwin下你给一个非Cygwin的程序路径,这样的路径,像DOS和报价。



Answer 7:

可能想尝试

keytool -import -trustcacerts -noprompt -keystore <full path to cacerts> -storepass changeit -alias $REMHOST -file $REMHOST.pem

老实说,我不知道它把你的证书,如果你只写cacerts只是给它一个完整的路径



Answer 8:

在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?