在新浪雲引擎 (SAE) 部署微信企業號/服務號 Java 後台時,常遇到「echostr 校驗失敗、AES 解密失敗、java.security.InvalidKeyException: Illegal key size」。根因是 **JDK 預設限制對稱加密金鑰長度 ≤ 128 位**,而微信 AES 採用 256 位金鑰,需安裝 **JCE Unlimited Strength Jurisdiction Policy Files** 解除限制。
Illegal key size 導致解密失敗,驗證不通過。$JAVA_HOME/jre/lib/security/ 下的 local_policy.jar、US_export_policy.jar**(無 root 權限)。| 方案 | 可行性 | 操作步驟 | 優/缺點 |
|---|---|---|---|
| 1. 升級 JDK 8u161+ / JDK 9+ | ✅ 最佳 | SAE 支援自定義運行時版本時,選擇 JDK 8u161 或更高版本(內建無限制策略) | 零代碼變更,永久解決;需 SAE 支援新版 JDK |
| 2. 程式碼啟用無限制策略 (JDK 8u152+) | ✅ 可行 | 在 main 或靜態區塊最早處加入:Security.setProperty("crypto.policy", "unlimited"); | 無需替換 jar,僅需 JDK 8u152+;SAE 若為舊版 JDK 則無效 |
| 3. 打包無限制策略檔至應用 | ⚠️ 有條件 | 將 local_policy.jar, US_export_policy.jar 放入 WEB-INF/lib,啟動時由類載入器覆蓋 | 類載入器隔離可能導致不生效;需測試 SAE 類載入順序 |
| 4. 避開 AES-256,改用相容模式 | 🔄 替代 | 微信後台關閉「安全模式」,改用明文/兼容模式 (僅簽名驗證) | 降低安全性;不推薦生產環境 |
| 5. 遷移至支援自定義 JDK 的平台 | ✅ 根治 | 遷移至雲主機 (CVM/ECS)、容器服務 (ACK/EKS)、Serverless (SCF/FC) 等具 Root/自定義運行時權限的平台 | 完全掌控 JDK 版本與安全策略;運維成本稍高 |
# 本地測試
java -version
jshell -e 'javax.crypto.Cipher.getMaxAllowedKeyLength("AES")' # 應輸出 2147483647 (無限制)
# 若輸出 128,說明策略未生效
已向 SAE 反饋,建議:
1. 預設運行時升級至 JDK 8u161+ 或 JDK 11/17 LTS。
2. 提供「啟用無限制加密策略」開關於控制台。
3. 文件明確標註微信/支付寶等需 AES-256 的場景解決方案。
// 在 Spring Boot Application 啟動類最頂部靜態區塊
static {
try {
// JDK 8u152+ 程式化啟用
Class> cls = Class.forName("javax.crypto.JceSecurity");
Field field = cls.getDeclaredField("isRestricted");
field.setAccessible(true);
field.set(null, java.lang.Boolean.FALSE);
} catch (Exception ignored) {
// 忽略,嘗試 Security.setProperty
Security.setProperty("crypto.policy", "unlimited");
}
}
若 SAE 短期無法升級 JDK,**方案 5 (遷移至可控平台) 是最穩妥的長期選擇**;短期可嘗試方案 2/3 並充分測試驗證流程。