Tomcat java.io.IOException:通过类加载器加载密钥库时密钥库格式无效
我一直在努力解决这个问题。当通过Tomcat上的类加载器加载密钥库时,我不断收到无效密钥库格式错误。我已经编写了一些单元测试,它们成功地通过类路径加载了我的密钥库,但是在Tomcat中运行时,我得到了无效的密钥库格式错误 这适用于RestTemplate Spring REST客户端 我的Spring配置代码。。。在单元测试和真实配置中几乎相同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
@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
变量只是加载特定环境属性的一种方法。。。环境=开发等。。。。使用JUnitSpringJUnit4ClassRunner.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)