You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 20:51:31