[记录]java.io.IOException: Wrong version of key store.的解决记录

前面解决了 no peer certificate的问题,使用了手动指定信任库的方式。一开始可以说“完美”解决了问题:保留了SSL的作用。不幸的是,在另一台android手机上调试时,遇到了另一个错误:

java.io.IOException: Wrong version of key store.

后面还有一大串,不过紧接着的一串是:at com.android.org.bouncycastle.jce.provider.JDKKeyStore.engineLoad(JDKKeyStore.java:812)

因为前面刚弄过keytool,所以对boundcycastle有过一面之缘。

我在前面说过,我使用的storetype是jks,但是在这个出错的android手机上的defaultstoretype是BKS。经过google得知,android上的证书需要以bks存储,所以这里应该是信任库的storetype问题,把他改成使用BKS即可,下面提供我自己使用的代码:

public void jks2bks(String jkspath,String jkspass,String bkspath,String bkspass){
FileInputStream jksFileInputStream=null;
FileOutputStream bksFileOutputStream =null;
try {
KeyStore jksKeyStore = KeyStore.getInstance("JKS");
jksFileInputStream = new FileInputStream(jkspath);
jksKeyStore.load(jksFileInputStream, jkspass.toCharArray());

KeyStore bksKeyStore = KeyStore.getInstance("BKS", new BouncyCastleProvider());
Security.addProvider(new BouncyCastleProvider());
bksFileOutputStream = new FileOutputStream(bkspath);
bksKeyStore.load(null, bkspass.toCharArray());

Enumeration<String> aliases = jksKeyStore.aliases();
while (aliases.hasMoreElements()) {
String alias = aliases.nextElement();

if(jksKeyStore.isCertificateEntry(alias)){
System.out.println("isCertificateEntry:"+alias);
Certificate certificate =jksKeyStore.getCertificate(alias);
bksKeyStore.setCertificateEntry(alias, certificate);
}else if (jksKeyStore.isKeyEntry(alias)) {
System.out.println("isKeyEntry:"+alias);
Key key =jksKeyStore.getKey(alias, jkspass.toCharArray());
Certificate[] certificates = jksKeyStore.getCertificateChain(alias);
bksKeyStore.setKeyEntry(alias, key, bkspass.toCharArray(), certificates);
}
}
bksKeyStore.store(bksFileOutputStream, bkspass.toCharArray());

} catch (KeyStoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CertificateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnrecoverableKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if (jksFileInputStream!=null) {
try {
jksFileInputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (bksFileOutputStream!=null) {
try {
bksFileOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

 

如果你想在一开始就使用BKS格式的信任库,那么可以在使用keytool时,指定provider和storetype为BKS即可,如下:
-storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "你存放BCprovider的位置/bcprov-jdk16-145.jar"

注意:

记得下载BC provider,地址在这里http://bouncycastle.org/download/bcprov-jdk16-145.jar

» 本文链接地址:https://www.xidige.com/785

打开支付宝扫一扫,即可进行扫码打赏哦

扫码支持
扫码打赏,你说多少就多少

标签:

分享到:

扫一扫 在手机阅读、分享本文

上一篇: 下一篇:
评论区0人评论969人参与

电子邮件地址不会被公开。 必填项已用*标注

*

loading

赞助商广告