後面有一段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("證書密鑰文件流關閉失敗."); } } } }