Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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 即使在添加CA证书后,也找不到请求目标的有效证书路径_Java_Spring Boot_Docker Compose_Openssl_Ssl Certificate - Fatal编程技术网

Java 即使在添加CA证书后,也找不到请求目标的有效证书路径

Java 即使在添加CA证书后,也找不到请求目标的有效证书路径,java,spring-boot,docker-compose,openssl,ssl-certificate,Java,Spring Boot,Docker Compose,Openssl,Ssl Certificate,这是我的代码,它通过api导入ca证书,但是导入证书后,它仍然给出错误,如下所示: “”“找不到请求目标的有效证书路径;嵌套异常为javax.net.ssl.SSLHandshakeException:PKIX路径生成失败”“… 我已验证证书已成功导入,但仍给出错误信息。 代码: InputStream certIn=certificateFile.getInputStream(); final char sep=File.separatorChar; File dir=新文件(System.g

这是我的代码,它通过api导入ca证书,但是导入证书后,它仍然给出错误,如下所示:

“”“找不到请求目标的有效证书路径;嵌套异常为javax.net.ssl.SSLHandshakeException:PKIX路径生成失败”“…
我已验证证书已成功导入,但仍给出错误信息。 代码:

InputStream certIn=certificateFile.getInputStream(); final char sep=File.separatorChar; File dir=新文件(System.getProperty(“java.home”)+sep+“lib”+sep+“security”); 文件=新文件(目录,“cacerts”); InputStream localCertIn=新文件InputStream(文件)

keystorekeystore=KeyStore.getInstance(KeyStore.getDefaultType());
load(localCertIn,keystrepassword.trim().toCharArray());
if(keystore.containsAlias(certAliasName.trim())){
证书关闭();
localCertIn.close();
返回新的响应属性(“证书别名已存在”,HttpStatus.CONFLICT);
}
localCertIn.close();
BufferedInputStream bis=新的BufferedInputStream(certIn);
CertificateFactory cf=CertificateFactory.getInstance(“X.509”);
while(bis.available()>0){
证书证书=cf.generateCertificate(bis);
setCertificateEntry(certAliasName.trim(),cert);
}
证书关闭();
OutputStream out=新文件OutputStream(文件);
存储(out,keyStorePassword.trim().toCharArray());
out.close();

我发现的另一种解决方案是,每次添加新证书时,我们都需要重新启动docker容器,但在生产级别,我们无法这样做,是否有人可以在这方面提供帮助?

您说的是“导入证书”和“验证…”。。。证书“。在英语中,此复数表示
certificateFile.getInputStream()
中有多个证书(PEM块)——是否有?如果有,因为您将每个证书(PEM块)存储在
certAliasName.trim()
中(第一个之后)覆盖并替换上一个文件,因此更新后的存储区中只剩下最后一个。嘿,是的,有多个pem文件,每个文件都被新文件覆盖,您能建议一些解决方案吗?如果您想要/需要所有文件,请为每个文件使用唯一的别名。如果您使用默认的TrustManager,它不依赖于任何特定的别名值,所以我使用的一种方法是序列号:1、2、3、4等等,它们很容易生成。嘿,找到了解决方案,是的,这个别名产生了一个问题,但是找到了,谢谢
    KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
    keystore.load(localCertIn, keyStorePassword.trim().toCharArray());
    if (keystore.containsAlias(certAliasName.trim())) {
        certIn.close();
        localCertIn.close();
        return new ResponseEntity<String>("Certificate Alias Name Already Exist", HttpStatus.CONFLICT);
    }
    localCertIn.close();

    BufferedInputStream bis = new BufferedInputStream(certIn);
    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    while (bis.available() > 0) {
        Certificate cert = cf.generateCertificate(bis);
        keystore.setCertificateEntry(certAliasName.trim(), cert);
    }

    certIn.close();

    OutputStream out = new FileOutputStream(file);
    keystore.store(out, keyStorePassword.trim().toCharArray());
    out.close();