无法在cacert中导入证书

时间:2017-05-17 10:05:19

标签: java ssl keytool

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

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

java -version提供C:\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();
        }
}
}
}

1 个答案:

答案 0 :(得分:0)

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

尝试

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

<强> EDITED

通过系统属性在JVM级别设置SSL属性。这意味着您可以在运行程序时设置它们(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