Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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
Tomcat java.io.IOException:通过类加载器加载密钥库时密钥库格式无效_Java_Spring_Tomcat_Keystore - Fatal编程技术网

Tomcat java.io.IOException:通过类加载器加载密钥库时密钥库格式无效

Tomcat java.io.IOException:通过类加载器加载密钥库时密钥库格式无效,java,spring,tomcat,keystore,Java,Spring,Tomcat,Keystore,我一直在努力解决这个问题。当通过Tomcat上的类加载器加载密钥库时,我不断收到无效密钥库格式错误。我已经编写了一些单元测试,它们成功地通过类路径加载了我的密钥库,但是在Tomcat中运行时,我得到了无效的密钥库格式错误 这适用于RestTemplate Spring REST客户端 我的Spring配置代码。。。在单元测试和真实配置中几乎相同 @Value("${env}") private String env; @Bean public RestTemplate getRestTempl

我一直在努力解决这个问题。当通过Tomcat上的类加载器加载密钥库时,我不断收到无效密钥库格式错误。我已经编写了一些单元测试,它们成功地通过类路径加载了我的密钥库,但是在Tomcat中运行时,我得到了无效的密钥库格式错误

这适用于RestTemplate Spring REST客户端

我的Spring配置代码。。。在单元测试和真实配置中几乎相同

@Value("${env}")
private String env;

@Bean
public RestTemplate getRestTemplate(HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory) {
    return new RestTemplate(httpComponentsClientHttpRequestFactory);
}

@Bean
public HttpComponentsClientHttpRequestFactory getHttpComponentsClientHttpRequestFactory(HttpClient httpClient) {
    HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
    return httpComponentsClientHttpRequestFactory;
}


@Bean
public HttpClientConnectionManager getHttpClientConnectionManager() throws Exception {
    String password = environment.getProperty("keystore.password");
    InputStream cpStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(env + "/keystore.jks");

    //load the keystore
    KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
    keystore.load(cpStream, password.toCharArray());
    SSLContext sslContext  = SSLContexts.custom().loadTrustMaterial(keystore).build();
    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);

    PlainConnectionSocketFactory plainsf = PlainConnectionSocketFactory.getSocketFactory();
    Registry<ConnectionSocketFactory> r = RegistryBuilder.<ConnectionSocketFactory>create().register("http",plainsf).register("https",sslsf).build();

    PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(r);
    cm.setMaxTotal(200);
    cm.setDefaultMaxPerRoute(50);
    return cm;
}

@Bean
public HttpClient getHttpClient(HttpClientConnectionManager httpClientConnectionManager) {
    return HttpClients.custom().setConnectionManager(httpClientConnectionManager).build();
}
env
变量只是加载特定环境属性的一种方法。。。环境=开发等。。。。使用JUnit
SpringJUnit4ClassRunner.class
运行该命令一切正常,但在将其部署到Tomcat时,我总是会收到无效的密钥库错误。如果我在文件系统上使用带有密钥库硬编码路径的
FileInputStream
,它在Tomcat中运行良好。我真的想用类加载器加载它

我在Liberty Profile中也尝试过,结果也一样

堆栈跟踪的相关部分:

Caused by: java.io.IOException: Invalid keystore format
at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:650)
at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:55)
at java.security.KeyStore.load(KeyStore.java:1445)

我发现我的问题。。。我的Maven过滤正在破坏密钥库。我需要将以下内容添加到pom.xml中。遗憾的是,我不认为这是我第一次遇到这个问题(

pom.xml:

src/main/resources
真的
**/*.xml
**/*.jks
src/main/resources
假的
**/*.jks
**/*.xml

能否发布完整的异常消息&stacktrace?我想知道这是否是JVM定义问题(不同的安全提供程序?不同的信任存储?)。stacktrace可能会有所帮助。跟踪JavaKeyStore的反编译代码。这些行正在执行。
if(xMagic!=MAGIC | |(xVersion!=VERSION_1&&xVersion!=VERSION_2)){throw new IOException(“无效密钥库格式”)}
对于记录,它对我无效。仍然存在相同的问题。
Caused by: java.io.IOException: Invalid keystore format
at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:650)
at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:55)
at java.security.KeyStore.load(KeyStore.java:1445)