Java 无法在cacert中导入证书

Java 无法在cacert中导入证书,java,ssl,keytool,Java,Ssl,Keytool,我有JAVA\u HOME=C:\Users\myuser\jdk1.8.0\u 65 Eclipse中的JRE系统库指向C:\Users\myuser\jdk1.8.0_65 java-version提供C:\Users\myuser\jdk1.8.0\u 65 通过以下方式导入证书: C:\Users\myuser\jdk1.8.0\u 65\bin\keytool.exe-importcert-trustcacerts-keystore C:\Users\myuser\jdk1.8.0\u

我有
JAVA\u HOME=C:\Users\myuser\jdk1.8.0\u 65

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

java-version
提供
C:\Users\myuser\jdk1.8.0\u 65

通过以下方式导入证书:

C:\Users\myuser\jdk1.8.0\u 65\bin\keytool.exe-importcert-trustcacerts-keystore C:\Users\myuser\jdk1.8.0\u 65\jre\lib\security\cacerts-storepass changeit-noprompt-alias ldap-file C:\Users\myuser\certificates\ldap\u 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();
        }
}
}
}

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

试一试

已编辑

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

必须设置的特定键如下所示:

javax.net.ssl.keyStore—包含 应用程序进程自己的证书和私钥。在窗户上, 指定的路径名必须使用前斜杠/,以代替 反斜杠

javax.net.ssl.keystrepassword-访问私钥的密码 来自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程序时引用密钥库C:\Users\myuser\jdk1.8.0\u 65\jre\lib\security\cacerts
keytool -list -keystore C:\Users\myuser\jdk1.8.0_65\jre\lib\security\cacerts