后面有一段java代码,它引起了下面两个问题。java
第一类问题:DerInputStream.getLength(): lengthTag=111, too big. 算法
就其根本缘由是:证书文件被篡改了。微信
是什么篡改它了? 是maven!maven
因为我使用了maven的pro配置功能,将证书放在了pro对应的文件中,若是你也是这样作的,请将文件移出来,直接放在一个固定的项目路径文件夹下。这样再次打包就不会被pro干扰,致使文件被篡改了。微信支付
第二类问题:Given final block not properly paddedcode
这个问题是由于。我有多个证书,致使文件流和密码不正确致使。我是作的微信支付退款,因为 微信会有多个退款模式:APP的退款、开放平台的退款、等。就会有多个证书了。每种退款都会有一个密码,也就是商户号(op_user_id),若是证书和密码不能对应,就会出现上面的异常了。get
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("证书密钥文件流关闭失败."); } } } }