全部产品

常见问题

更新时间:2020-03-03 22:17

本文针对当前版本 Java SDK 的常见问题提供解决方法以供参考。针对错误码,可参考 错误码说明 进行问题排查。

说明:若发送交易出现 SERVICE_TX_WAITING_VERIFY=413 或者 SERVICE_TX_WAITING_EXECUTE=414 错误码,您需要自行调用查询收据接口进行排查。

加载 user.key 失败,提示 key 长度不合法

运行错误提示:
  1. 09:49:40.623 [main] ERROR com.github.lyd.msg.provider.DemoSample - unable to read private key,wrong password? errorCode :{MychainSdkErrorCodeEnum{errorCode='30001', errorDesc='sdk invalid private key'}}
  2. 09:49:40.626 [main] ERROR com.github.lyd.msg.provider.DemoSample - unable to read encrypted data: 1.2.840.113549.1.12.1.3 not available: Illegal key size or default parameters
  3. Exception in thread "main" com.alipay.mychain.sdk.exceptions.MychainSdkException: unable to read encrypted data: 1.2.840.113549.1.12.1.3 not available: Illegal key size or default parameters

ERROR

解决方法:

出现此错误的原因是个别 JDK 的默认配置限制了 key 的长度,因此 SDK 在加载 key 文件时解密失败。

可在 DemoSample.javamain 函数最开始位置,增加一段代码来进行处理,如下所示。

  1. String errorString = "Failed to modify key-length permissions";
  2. int newMaxKeyLength;
  3. try {
  4. if ((newMaxKeyLength = Cipher.getMaxAllowedKeyLength("AES")) < 256) {
  5. System.out.println("will modify aes length");
  6. Class c = Class.forName("javax.crypto.CryptoAllPermissionCollection");
  7. Constructor con = c.getDeclaredConstructor();
  8. con.setAccessible(true);
  9. Object allPermissionCollection = con.newInstance();
  10. Field f = c.getDeclaredField("all_allowed");
  11. f.setAccessible(true);
  12. f.setBoolean(allPermissionCollection, true);
  13. c = Class.forName("javax.crypto.CryptoPermissions");
  14. con = c.getDeclaredConstructor();
  15. con.setAccessible(true);
  16. Object allPermissions = con.newInstance();
  17. f = c.getDeclaredField("perms");
  18. f.setAccessible(true);
  19. ((Map) f.get(allPermissions)).put("*", allPermissionCollection);
  20. c = Class.forName("javax.crypto.JceSecurityManager");
  21. f = c.getDeclaredField("defaultPolicy");
  22. f.setAccessible(true);
  23. Field mf = Field.class.getDeclaredField("modifiers");
  24. mf.setAccessible(true);
  25. mf.setInt(f, f.getModifiers() & ~Modifier.FINAL);
  26. f.set(null, allPermissions);
  27. newMaxKeyLength = Cipher.getMaxAllowedKeyLength("AES");
  28. }
  29. } catch (Exception e) {
  30. throw new RuntimeException(errorString, e);
  31. }
  32. if (newMaxKeyLength < 256) {
  33. throw new RuntimeException(errorString);
  34. }