Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当我尝试添加SSL证书时,为什么方法generateCertificate返回CertificateException?_Java_Ssl Certificate_Keystore - Fatal编程技术网

Java 当我尝试添加SSL证书时,为什么方法generateCertificate返回CertificateException?

Java 当我尝试添加SSL证书时,为什么方法generateCertificate返回CertificateException?,java,ssl-certificate,keystore,Java,Ssl Certificate,Keystore,我正在尝试接受用于API测试的SSL证书。 为此,我使用IE导出了我的证书(使用第二个选项:x.509二进制编码基64(*.cer) 我使用以下命令行将其添加到密钥库中: keytool -importcert -file certificate.cer -keystore "C:\Program Files\Java\jdk1.8.0_111\jre\lib\security\cacerts" -alias "certificatealias" keytool -list -v -key

我正在尝试接受用于API测试的SSL证书。 为此,我使用IE导出了我的证书(使用第二个选项:x.509二进制编码基64(*.cer) 我使用以下命令行将其添加到密钥库中:

 keytool -importcert -file certificate.cer -keystore "C:\Program
 Files\Java\jdk1.8.0_111\jre\lib\security\cacerts" -alias "certificatealias"
keytool -list -v -keystore "C:\Program
     Files\Java\jdk1.8.0_111\jre\lib\security\cacerts"  > java_cacerts.txt
要列出密钥库并检查是否有我的证书条目,我使用以下命令行:

 keytool -importcert -file certificate.cer -keystore "C:\Program
 Files\Java\jdk1.8.0_111\jre\lib\security\cacerts" -alias "certificatealias"
keytool -list -v -keystore "C:\Program
     Files\Java\jdk1.8.0_111\jre\lib\security\cacerts"  > java_cacerts.txt
我的证书条目在里面:

别名:证书注册日期:2016年6日类型 d'entreée:trustedCertEntry

固有值:CN=测试,O=测试目标: CN=测试,O=测试编号:XXXX Valide du:xxx au:xxxx

认证证书编号:MD5:Xxxxxx SHA1:xxxx SHA256: XXXX

签名算法名称:SHA256withRSA版本:3

在我的代码中,我有:

FileInputStream in = new FileInputStream("certificate.jks");
BufferedInputStream bis = new BufferedInputStream(in);
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(bis, "changeit".toCharArray());

Enumeration<String> aliases = ks.aliases();
while (aliases.hasMoreElements()) {
    String alias = aliases.nextElement();
    System.out.println("alias: " + alias);
    System.out.println("bis.available: " +bis.available());
    System.out.println("bis: "+ bis.toString());

    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    X509Certificate x509 = (X509Certificate) cf.generateCertificate(bis);
    KeyStore.Entry newEntry = new KeyStore.TrustedCertificateEntry(x509);
    ks.setEntry("certificatealias", newEntry, null);
}
FileInputStream in=newfileinputstream(“certificate.jks”);
BufferedInputStream bis=新的BufferedInputStream(in);
KeyStore ks=KeyStore.getInstance(KeyStore.getDefaultType());
加载(bis,“changeit.toCharArray());
枚举别名=ks.alias();
while(别名.hasMoreElements()){
字符串别名=别名。nextElement();
System.out.println(“别名:”+别名);
System.out.println(“bis.available:+bis.available());
System.out.println(“bis:+bis.toString());
CertificateFactory cf=CertificateFactory.getInstance(“X.509”);
x509证书x509=(x509证书)cf.generateCertificate(bis);
KeyStore.Entry newEntry=新KeyStore.TrustedCertificateEntry(x509);
ks.setEntry(“certificatealias”,newEntry,null);
}
我收到一个错误:

java.security.cert.CertificateException:无法分析证书: java.io.IOException:空输入

在我的控制台中,我有:

FileInputStream in = new FileInputStream("certificate.jks");
BufferedInputStream bis = new BufferedInputStream(in);
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(bis, "changeit".toCharArray());

Enumeration<String> aliases = ks.aliases();
while (aliases.hasMoreElements()) {
    String alias = aliases.nextElement();
    System.out.println("alias: " + alias);
    System.out.println("bis.available: " +bis.available());
    System.out.println("bis: "+ bis.toString());

    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    X509Certificate x509 = (X509Certificate) cf.generateCertificate(bis);
    KeyStore.Entry newEntry = new KeyStore.TrustedCertificateEntry(x509);
    ks.setEntry("certificatealias", newEntry, null);
}
别名:certificatealias

双可用:0
bis:java.io。BufferedInputStream@8xx9d4

错误出现在
cf.generateCertificate(bis)

为什么我有这个错误?cf和bis不是空的或空的

我发现密钥库类型可能是错误的(请参阅文章)。
keystore.getDefaultType()
返回JKS。这应该很好,不是吗? 我已经用命令行检查过:
keytool-list-keystore
我有以下类型:

类型:JKS

太阳


任何提示都会非常有用!

您已将密钥库加载到
bis
输入流中。您不能使用该操作从中创建证书,因为它是整个密钥库。如果您需要获取证书对象并将其添加到密钥库,则应使用输入流加载证书(就像您对密钥库所做的那样),并将该输入流馈送到
generateCertificate
方法。您可以使用类似
FileInputStream
的输入流加载证书。感谢您的帮助。我添加了以下行:
FileInputStream证书=新的FileInputStream(“certificate.cer”);BufferedInputStream bis2=新的BufferedInputStream(证书);
并将该行更正为cf.generateCertificate(bis2);`但是,我遇到另一个错误
javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效证书路径
您的信任库中可能没有完整的证书链。当我打印
cf.generateCertificate(bis2)
我有:`cert:[[Version:V3 Subject:CN=Test,O=Test签名算法:SHA256withRSA,OID=XX Key:Sun RSA公钥,1024位模数:XX(太长)公共指数:XX有效性:[从:X到:X颁发者:CN=Test,O=Test序列号:[XX]]算法:[SHA256withRSA]签名:XX(太长)]'看起来它是一个测试证书,您应该将整个链连接到您的cacert密钥库以使其工作。如果您使用动态方法创建信任库,其中包含建立连接所需的证书,则需要创建自定义SSLSocketFactory,您可以参考此帖子。在调用之前,您可以执行HttpsURLConnection.setDefaultSSLSocketFactory(sslSocketFactory);您已将密钥库加载到
bis
输入流中。您不能使用它创建证书,因为它是整个密钥库。如果您需要获取证书对象并将其添加到密钥库,则应使用输入流加载证书(就像您对密钥库所做的那样),并将该输入流提供给
generateCertificate
方法。您可以使用类似
FileInputStream
的输入流来加载证书。感谢您的帮助。我添加了以下行:
FileInputStream证书=新的FileInputStream(“certificate.cer”);BufferedInputStream bis2=新的BufferedInputStream(证书);
并将该行更正为cf.generateCertificate(bis2);`但是,我遇到另一个错误
javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效证书路径
您的信任库中可能没有完整的证书链。当我打印
cf.generateCertificate(bis2)
我有:`cert:[[Version:V3 Subject:CN=Test,O=Test签名算法:SHA256withRSA,OID=XX Key:Sun RSA公钥,1024位模数:XX(太长)公共指数:XX有效性:[从:X到:X颁发者:CN=Test,O=Test序列号:[XX]]算法:[SHA256withRSA]签名:XX(太长)]看起来像是一个测试证书,您应该将整个链连接到您的cacert密钥库,以使其工作。如果您使用动态方法创建信任库,其中包含