标签:android style blog http color io os java ar
近来在集成第三方支付---支付宝,在集成的过程中严格按照支付宝开发者平台所发布的说明文档和Demo,在我的测试机上可以完美的运行,但是在别人的手机无论怎么就是调用不起来,问题弹出"remote call failed". 翻来复去,代码检查了好几遍,总是找不到错误在哪。
然后,仔细地查看了一下LogCat,发现一条Warning,显示是InvalidKeySpecException异常,显示如下:
09-23 20:03:34.735: W/System.err(24906): java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag 09-23 20:03:34.740: W/System.err(24906): at org.apache.harmony.xnet.provider.jsse.OpenSSLKey.getPrivateKey(OpenSSLKey.java:124) 09-23 20:03:34.740: W/System.err(24906): at org.apache.harmony.xnet.provider.jsse.OpenSSLRSAKeyFactory.engineGeneratePrivate(OpenSSLRSAKeyFactory.java:64) 09-23 20:03:34.740: W/System.err(24906): at java.security.KeyFactory.generatePrivate(KeyFactory.java:186) 09-23 20:03:34.740: W/System.err(24906): at com.slanissue.apps.mobile.bevarhymes.util.Rsa.sign(Rsa.java:68) 09-23 20:03:34.740: W/System.err(24906): at com.slanissue.apps.mobile.bevarhymes.PayActivity.executeAliPay(PayActivity.java:1055) 09-23 20:03:34.740: W/System.err(24906): at com.slanissue.apps.mobile.bevarhymes.PayActivity.access$9(PayActivity.java:1050) 09-23 20:03:34.740: W/System.err(24906): at com.slanissue.apps.mobile.bevarhymes.PayActivity$5.onSuccess(PayActivity.java:443) 09-23 20:03:34.740: W/System.err(24906): at com.loopj.android.http.JsonHttpResponseHandler$1$1.run(JsonHttpResponseHandler.java:125) 09-23 20:03:34.740: W/System.err(24906): at android.os.Handler.handleCallback(Handler.java:730) 09-23 20:03:34.740: W/System.err(24906): at android.os.Handler.dispatchMessage(Handler.java:92) 09-23 20:03:34.740: W/System.err(24906): at android.os.Looper.loop(Looper.java:176) 09-23 20:03:34.740: W/System.err(24906): at android.app.ActivityThread.main(ActivityThread.java:5454) 09-23 20:03:34.740: W/System.err(24906): at java.lang.reflect.Method.invokeNative(Native Method) 09-23 20:03:34.740: W/System.err(24906): at java.lang.reflect.Method.invoke(Method.java:525) 09-23 20:03:34.740: W/System.err(24906): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209) 09-23 20:03:34.740: W/System.err(24906): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025) 09-23 20:03:34.740: W/System.err(24906): at dalvik.system.NativeStart.main(Native Method) 09-23 20:03:34.745: W/System.err(24906): Caused by: java.lang.RuntimeException: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag 09-23 20:03:34.745: W/System.err(24906): at org.apache.harmony.xnet.provider.jsse.NativeCrypto.d2i_PKCS8_PRIV_KEY_INFO(Native Method) 09-23 20:03:34.745: W/System.err(24906): at org.apache.harmony.xnet.provider.jsse.OpenSSLKey.getPrivateKey(OpenSSLKey.java:122) 09-23 20:03:34.745: W/System.err(24906): ... 16 more
点击第5行进去,发现错误在这儿:
1 PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec( 2 Base64.decode(privateKey)); 3 KeyFactory keyf = KeyFactory.getInstance("RSA"); 4 PrivateKey priKey = keyf.generatePrivate(priPKCS8);
但是这里显然没有错啊?这到底是怎么回事呢??
经过在博客和StackOverFlow上查询,发现原来是这样的:
在Android4.1.0之前的版本,代码行
1 KeyFactory keyf = KeyFactory.getInstance("RSA");
是工作正常的。但是在4.1.0之后,这个就不能正常工作了,需要将该代码改变成:
1 KeyFactory keyf = KeyFactory.getInstance("RSA", "BC");
然后就研究了一下这个方法的作用,API上面说的是:“为指定提供程序中的指定算法生成 KeyFactory 对象”;
即:KeyFactory.getInstance(String algorithm, String provider);中的algorithm为“指定算法”,provider为“指定提供程序”。
或许是因为Android虚拟机Dalvik对KeyFactory的实现中,默认的provider在4.1.0之后由"BC"改为了其它的了。当然,仅是猜测。
还好最终解决了问题。
支付宝集成时的InvalidKeySpecException
标签:android style blog http color io os java ar
原文地址:http://www.cnblogs.com/littlepanpc/p/3989232.html