码迷,mamicode.com
首页 > 其他好文 > 详细

支付宝集成时的InvalidKeySpecException

时间:2014-09-23 23:05:15      阅读:305      评论:0      收藏:0      [点我收藏+]

标签: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之前的版本,代码行

bubuko.com,布布扣
1 KeyFactory keyf = KeyFactory.getInstance("RSA");
View Code

是工作正常的。但是在4.1.0之后,这个就不能正常工作了,需要将该代码改变成:

bubuko.com,布布扣
1 KeyFactory keyf = KeyFactory.getInstance("RSA", "BC");
View Code

然后就研究了一下这个方法的作用,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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!