【问题标题】:Not able to import certificate in cacert无法在 cacert 中导入证书
【发布时间】:2017-10-16 17:34:21
【问题描述】:

我有JAVA_HOME=C:\Users\myuser\jdk1.8.0_65

Eclipse 中的 JRE 系统库指向 C:\Users\myuser\jdk1.8.0_65

java -versionC:\Users\myuser\jdk1.8.0_65

导入证书:

C:\Users\myuser\jdk1.8.0_65\bin\keytool.exe -importcert -trustcacerts -keystore C:\Users\myuser\jdk1.8.0_65\jre\lib\security\cacerts -storepass changeit -noprompt -alias ldap -file C:\Users\myuser\certificates\ldap_cer.cer

Keytool 列表给出:

C:\Users\myuser>keytool -list
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN

Your keystore contains 0 entries

当我尝试使用以下程序检查证书时,我可以看到条目,为什么keytool -list 没有给我相同的结果?如何添加证书?我错过了什么?

package com.;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.Certificate;
import java.util.Enumeration;
public class HandShake {
static FileInputStream  is;
public static void main(String[] args) {
try {

    File file = new File("C://Users//myuser//jdk1.8.0_65//jre//lib//security//cacerts");
    System.setProperty("javax.net.ssl.keyStore", file.getAbsolutePath());
    System.out.println(System.getProperty("javax.net.ssl.keyStore"
            ));
    is= new FileInputStream(file);
    KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
    String password = "changeit";
    keystore.load(is, password.toCharArray());
    Enumeration enumeration = keystore.aliases();
    while(enumeration.hasMoreElements()) {
        String alias = (String)enumeration.nextElement();
        if(alias.equals("ldap")){

        System.out.println("alias name: " + alias);
        Certificate certificate = keystore.getCertificate(alias);
        System.out.println(certificate.toString());
        }
    }

} catch (java.security.cert.CertificateException e4) {
    e4.printStackTrace();
} catch (NoSuchAlgorithmException e1) {
    e1.printStackTrace();
} catch (FileNotFoundException e2) {
    e2.printStackTrace();
} catch (KeyStoreException e3) {
    e3.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}finally {
    if(null != is)
        try {
            is.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}
}
}

【问题讨论】:

    标签: java ssl keytool


    【解决方案1】:

    您可能正在尝试在另一个密钥库上运行 keystore -list

    试试

    keytool -list -keystore C:\Users\myuser\jdk1.8.0_65\jre\lib\security\cacerts
    

    已编辑

    SSL 属性是通过系统属性在 JVM 级别设置的。这意味着您可以在运行程序时设置它们(java -D ....),或者您可以通过执行 System.setProperty 在代码中设置它们。

    您必须设置的具体键如下:

    javax.net.ssl.keyStore- Java 密钥库文件的位置,包含 应用程序进程自己的证书和私钥。在 Windows 上, 指定的路径名​​必须使用正斜杠 / 代替 反斜杠。

    javax.net.ssl.keyStorePassword - 访问私钥的密码 来自 javax.net.ssl.keyStore 指定的密钥库文件。这 密码被使用两次:解锁密钥库文件(存储密码), 以及解密存储在密钥库中的私钥(密钥密码)。

    javax.net.ssl.trustStore - Java 密钥库文件的位置 包含受此信任的 CA 证书的集合 应用程序进程(信任库)。在 Windows 上,指定的路径名 必须使用正斜杠 / 代替反斜杠。

    如果未使用此属性指定信任存储位置,则 SunJSSE 实现在 以下位置(按顺序):

    $JAVA_HOME/lib/security/jssecacerts $JAVA_HOME/lib/security/cacerts javax.net.ssl.trustStorePassword - 解锁密钥库的密码 javax.net.ssl.trustStore 指定的文件(存储密码)。

    javax.net.ssl.trustStoreType - (可选)用于 Java 密钥库文件 格式,此属性的值为 jks(或 JKS)。你通常不会 指定这个属性,因为它的默认值已经是 jks。

    javax.net.debug - 要打开 SSL/TLS 层的日志记录,请设置此项 属性到 ssl。

    java SSL and cert keystore

    【讨论】:

    • 谢谢 我仍然收到证书链接错误。如何确保在运行我的 java 程序时引用密钥库 C:\Users\myuser\jdk1.8.0_65\jre\lib\security\cacerts
    猜你喜欢
    • 1970-01-01
    • 2017-05-20
    • 2012-06-30
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2015-01-11
    相关资源
    最近更新 更多