最近碰到很恶心的玩意,就是用 Spring 打包 jar 时,用如下代码进行读取ssl证书
public RestTemplate getRestTemplateWithCert() {
RestTemplate restTemplate = null;
try {
KeyStore keyStore = KeyStore.getInstance("PKCS12");//eg. PKCS12
// 这个之前尝试放在resources目录下来读取,结果这个居然是证书错误的源头,使用下面的直接从路径读取就能成功了,证书读取有问题spring没有报错,大坑 --来自 黎胜锬同志的吐槽
// InputStream cp = this.getClass().getResourceAsStream("test.p12");
//读取本地路径
// FileInputStream instream = new FileInputStream(new File("D:\\ssl\\test.p12"));
InputStream instream = certificate.getInputStream();
keyStore.load(instream, certificatePassword.toCharArray());
SSLContext sslcontext = SSLContextBuilder.create()
.loadKeyMaterial(keyStore, certificatePassword.toCharArray())
.build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1.2"}, null, NoopHostnameVerifier.INSTANCE);
CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
restTemplate = new RestTemplate(factory);
//将转换器的编码换成utf-8
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(Charset.forName("utf-8")));
//System.out.println("restTemplate.hashCode():" + restTemplate.hashCode());
} catch (Exception e) {
e.printStackTrace();
}
return restTemplate;
}
使用 spring 打包成 jar 包后 在 linux上面运行,正常,但是在windows 中使用 java -jar you.jar 运行后报错 java.io.IOException: keystore password was incorrect,
百度 ,google了半天,说是打包 jar 会导致证书被修改,然后在pom中添加了如下代码
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>*.p12</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>fals