后面有一段java代码,它引发了下面两个问题。
第一类问题:DerInputStream.getLength(): lengthTag=111, too big.
就其根本原因是:证书文件被篡改了。
是什么篡改它了? 是maven!
由于我使用了maven的pro配置功能,将证书放在了pro对应的文件中,如果你也是这样做的,请将文件移出来,直接放在一个固定的项目路径文件夹下。这样再次打包就不会被pro干扰,导致文件被篡改了。
第二类问题:Given final block not properly padded
这个问题是因为。我有多个证书,导致文件流和密码不正确导致。我是做的微信支付退款,由于 微信会有多个退款模式:APP的退款、开放平台的退款、等。就会有多个证书了。每种退款都会有一个密码,也就是商户号(op_user_id),如果证书和密码不能对应,就会出现上面的异常了。
tempKeyStore.load(instream, op_user_id.toCharArray());
/***
* *
* @作者 Dick
* @TODO 获取keyStore,同步静态方法,只需要创建一个即可
* @创建时间 2016年1月25日 下午8:45:04
* @return
* @修改备注
**
*/
public synchronized static KeyStore getKeyStore(String op_user_id,String CERT_PATH) {
//if(keyStore!=null)return keyStore;
InputStream instream = null;
String certReallyPath = null;
KeyStore tempKeyStore = null;
try {
// 获取一个keystore,是PKCS12类型
tempKeyStore = KeyStore.getInstance(KEY_STORE_TYPE);
logger.info("创建KeyStore成功:"+KEY_STORE_TYPE);
ClientCustomSSL ccs=new ClientCustomSSL();
logger.info("获取当前地址"+ccs.getClass().getResource("/").getPath());
certReallyPath = ccs.getClass().getResource(CERT_PATH).getPath();
logger.info("获取证书路径成功:"+certReallyPath);
// 获取密钥文件
instream =ccs.getClass().getResourceAsStream(CERT_PATH);
if(instream!=null)
logger.info("证书文件流获取成功.");
else
logger.info("证书文件流获取失败.");
logger.error("op_user_id====================" + op_user_id);
logger.info("op_user_id====================" + op_user_id);
logger.error("CERT_PATH====================" + CERT_PATH);
logger.info("CERT_PATH====================" + CERT_PATH);
tempKeyStore.load(instream, op_user_id.toCharArray());
logger.info("根据证书证书文件流加载KeyStore成功.");
keyStore=tempKeyStore;
return keyStore;
} catch (FileNotFoundException e) {
logger.error("微信证书文件不存在:" + certReallyPath, e);
throw new BaseException("微信证书文件不存在:" + certReallyPath, e);
} catch (NoSuchAlgorithmException e) {
logger.error("微信证书加载失败,未能找到相应的算法:" + tempKeyStore.getType(), e);
throw new BaseException("微信证书加载失败,未能找到相应的算法:"
+ tempKeyStore.getType(), e);
} catch (CertificateException e) {
logger.error("微信证书异常:", e);
throw new BaseException("微信证书异常:", e);
} catch (IOException e) {
logger.error("微信证书文件读取异常:", e);
throw new BaseException("微信证书文件读取异常:", e);
} catch (KeyStoreException e) {
logger.error("微信证书 密钥库异常。:", e);
throw new BaseException("微信证书 密钥库异常。:", e);
} finally {
if (instream != null) {
try {
instream.close();
logger.info("关闭证书读取流.");
} catch (IOException e) {
logger.error("证书密钥文件流关闭失败.");
}
}
}
}