Android Kotlin集成RevenueMonster SDK报WRONG_TAG密钥异常求助
Android Kotlin集成RevenueMonster SDK触发ASN.1 WRONG_TAG异常排查
问题场景
在Android Kotlin项目中集成RevenueMonster Kotlin SDK,完成配置初始化与移动支付请求逻辑编写后,运行代码触发密钥解析异常。
核心实现代码如下:
val rsaKeyStr = "-----BEGIN RSA PRIVATE KEY-----"PRIVATEKEY"-----END RSA PRIVATE KEY-----" val config = Config( clientID = "CLIENTID", clientSecret = "JjMHZCCyzvNlSaRQqwfPlXXDbGoWmAAA", privateKey = rsaKeyStr, publicKey = "-----BEGIN PUBLIC KEY-----" + "PUBLICKEY" "-----END PUBLIC KEY-----", sandbox = true ) GlobalScope.launch { try { val sdk = RevenueMonsterSDK(config) val data = WebMobilePaymentRequest( order = Order( id = "1655811603734186872", title = "PaymentTest", detail = "JUST A TEST", additionalData = "NONE", amount = 11, currencyType = "MYR" ), storeId = "1623743430847879711", customer = WebMobilePaymentCustomer( userId = "12345", email = "" ), type = "MOBILE_PAYMENT", layoutVersion = "v3", notifyUrl = "https://dev-rm-api.ap.ngrok.io", redirectUrl = "https://revenuemonster.my" ) // 创建快捷支付订单 val result = sdk.Payment.webMobilePayment(data) Log.e("result::>", result.toString()) } catch (e: Error) { Log.e("ERROR::>", e.toString()) } catch (e: Throwable) { Log.e("Throwable::>", e.toString()) } }
已确认公钥、私钥的头尾标识格式符合要求,其余支付逻辑均由SDK内部实现处理,运行时抛出异常如下:
java.security.spec.InvalidKeySpecException:
java.lang.RuntimeException: error:0c0000be:ASN.1 encoding
routines:OPENSSL_internal:WRONG_TAG
排查思路与解决方案
该异常是RSA密钥格式不符合Android平台OpenSSL解析规则导致,按以下优先级逐一排查修复即可:
- 修复密钥字符串拼接错误
现有代码公私钥拼接逻辑存在问题:私钥字符串的密钥内容被写在字符串引号外部,编译后无法得到完整密钥值;公钥拼接时密钥内容行末尾缺失+连接符,最终生成的公钥字符串结构不完整。
修复时需保证密钥的头尾标识、中间Base64编码内容、每行的换行符\n完整保留,无缺失字符也无多余无关字符,参考写法:val rsaKeyStr = "-----BEGIN PRIVATE KEY-----\n" + "私钥第一行Base64内容\n" + "私钥第二行Base64内容\n" + // 逐行拼接完整私钥内容 "-----END PRIVATE KEY-----" val publicKeyStr = "-----BEGIN PUBLIC KEY-----\n" + "公钥第一行Base64内容\n" + "公钥第二行Base64内容\n" + // 逐行拼接完整公钥内容 "-----END PUBLIC KEY-----" - 修正私钥编码格式不匹配问题
Android原生密钥解析器不支持PKCS#1格式的RSA私钥(开头标识为-----BEGIN RSA PRIVATE KEY-----),仅支持PKCS#8格式私钥(开头标识为-----BEGIN PRIVATE KEY-----)。
如果从平台获取的是PKCS#1格式私钥,本地通过OpenSSL工具执行以下命令转换为PKCS#8格式即可:
将转换后的私钥内容替换到代码配置中即可正常解析。openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in origin_private.pem -out pkcs8_private.pem - 清理密钥内容中的冗余字符
复制密钥时很容易带入多余空格、不可见特殊字符、错误换行,这类冗余字符会直接导致ASN.1标签校验失败。需逐行检查密钥内容,确保除头尾标识、Base64编码段、必要换行符外无其他任何字符。 - 协程使用优化
不建议使用GlobalScope启动协程,会存在内存泄漏、生命周期失控风险,替换为页面绑定的lifecycleScope即可。
内容的提问来源于stack exchange,提问作者Himani
相关产品推荐
相关产品推荐

