默认情况下,如何正确地将自签名证书导入到Java密钥库中,所有Java应用程序都可以使用该证书?


144

我确实想将自签名证书导入Java,因此任何尝试建立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:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到指向所请求目标的有效证书路径

我不一定要依赖该代码。Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider())在第一部分中,完全不需要这样的事情。第二个不做任何证书验证。尝试从平原URLConnection开始。您确定您已经修改cacertslib/securityJRE安装?您是否尝试过trustmanager调试选项
布鲁诺

Answers:


225

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

  1. 下载并安装portecle。
  2. 首先,请确保100%确保知道使用哪个JRE或JDK运行程序。在64位Windows 7上,可能会有很多JRE。Process Explorer可以帮助您解决此问题,或者您可以使用: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

1
这样做的主要思想不是移植,而是将证书导入正确的密钥库。
阿法拉沃

这行得通,但是我的java在另一个位置。我的密钥库位于/ usr / lib / jvm / java-openjdk / jre / lib / security / cacerts,我通过运行发现ps -ef | grep java它,它告诉我我的Java是从位于/ usr / lib / jvm / java-openjdk /的openjdk运行的bin / java。另外,如果是网络应用程序,请记住重新启动。谢谢您的帮助!!
Codezilla

7
我没有使用过portecle,但是我发现Keystore Explorer在Windows,Linux上也能很好地工作(并且它也应该在OSX上也能工作)
Xantix

确实非常有帮助。这里突出了2个非常重要的事情。一种是在正确的密钥库中导入。另一种是确保在使用网络服务器的情况下重新启动。
sdm

6
在2019年,我们甚至可以使用Lets
crypto

41
    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"

12
系统将提示您输入密钥库密码,默认密码为“ changeit”
The Gilbert Arenas Dagger

34

我最后写了一个小脚本,将证书添加到密钥库,因此使用起来容易得多。

您可以从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

```


18

这对我有用。:)

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

4

如果您使用的是默认情况下Java cacerts文件中未包含的由证书颁发机构签名的证书,则需要完成以下HTTPS连接配置。要将证书导入cacerts:

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

使用以下命令:-> keytool -import -alias <alias> -keystore <cacerts_file> -trustcacerts -file <certificate_filename>
Bharat Darakh 2015年

1

简单的命令“ keytool”也可以在Windows和/或Cygwin上使用。

如果您使用的是Cygwin,这是我从“ S.Botha's”答案的底部使用的修改后的命令:

  1. 确保您确定要使用的JDK中的JRE
  2. 以管理员身份启动提示符/ cygwin
  3. 进入该JDK的bin目录,例如cd / cygdrive / c / Program \ Files / Java / jdk1.8.0_121 / jre / bin
  4. 从内部执行keytool命令,最后在其中提供指向新证书的路径,如下所示:

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

请注意,因为如果这是在Cygwin下,则将为非Cygwin程序提供路径,因此该路径类似于DOS,并且用引号引起来。


0

可能想尝试

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

老实说,我不知道如果只写cacerts就给证书一个完整的路径,它将证书放在哪里



0
fist get the certificate from the provider
create a file ends wirth .cer and pase the certificate

copy the text file or  past   it  somewhere you can access it 
then use the cmd prompt as an admin and cd to the bin of the jdk,
the cammand that will be used is the:  keytool 

change the  password of the keystore with :

keytool  -storepasswd -keystore "path of the key store from c\ and down"

the password is : changeit 
 then you will be asked to enter the new password twice 

then type the following :

keytool -importcert -file  "C:\Program Files\Java\jdk-13.0.2\lib\security\certificateFile.cer"   -alias chooseAname -keystore  "C:\Program Files\Java\jdk-13.0.2\lib\security\cacerts"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.