对接秘钥备忘
走了太多弯路,没有一个攻略,实在是太难了
- 对接平台提供
server.csr
server.key - 微众返回
trustca.jks
WeBank_DEV_CA.crt
haha.crt
haha.csr
haha.jks
haha.key
haha.p12
根据命令行可得
haha.crt + server.key => haha.p12
haha.p12 => haha.jks
- 微众给的crt,和我自己的key文件,生成p12文件
openssl pkcs12 -export -in haha.crt -inkey server.key -out haha.p12 -name haha -CAfile myCA.crt
输入密码是a123456(各自定义),要重复一次,还会报错,但是不要紧,p12文件出来就行
name 别名和cafile都无关紧要
报错信息,其实不要紧
Enter Export Password:
Verifying - Enter Export Password:
Verify failure
Can't read Password
- p12 生成jks
keytool -importkeystore -srckeystore haha.p12 -srcstoretype PKCS12 -srcstorepass a123456 -deststoretype JKS -destkeystore haha.jks -deststorepass b123456
这样密码就是a123456,b123456,也可以设一样的,各自随意
题外话: jks可以和p12互转。
jks可以转成cer文件(有的网站直接可以导出cer),cer再导入jre,理论上不需要代码里面再提现这方面内容,当然这里没有验证过
- 或者直接用微众返回的 haha.jks
默认密码 Abcd1234(测试环境已证实)
代码示例
public CloseableHttpClient initHttpClient() {
CloseableHttpClient httpClient = null;
try {
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
//加载证书文件
FileInputStream instream = new FileInputStream(new File(webankConf.getCertPath()));//jks导入
try {
//这里是storepass b123456
keyStore.load(instream, "Abcd1234".toCharArray());
} finally {
instream.close();
}
// 这里是源密码,a123456
SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, "Abcd1234".toCharArray()).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
httpClient = HttpClients.custom()
.setSSLSocketFactory(sslsf)
.build();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
} catch (UnrecoverableKeyException e) {
e.printStackTrace();
}
return httpClient;
}