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

Android发布版创建X509Certificate时遇SHA256WITHRSA算法异常

解决Android发布构建中创建X509Certificate时的SHA256WITHRSA算法缺失问题

问题核心

发布构建时抛出java.security.NoSuchAlgorithmException: no such algorithm: SHA256WITHRSA for provider SC,Debug版本正常,原因通常是发布版的代码混淆(ProGuard/R8)移除了SpongyCastle(SC)的算法实现类,或者Provider未正确注册/算法名称不匹配。

解决方案

1. 添加ProGuard/R8规则保留SpongyCastle类

发布构建时,ProGuard可能会误删SpongyCastle中算法实现的核心类,需在proguard-rules.pro中添加以下规则:

# 保留SpongyCastle所有类和接口,避免算法实现被混淆移除
-keep class org.spongycastle.** { *; }
-keep interface org.spongycastle.** { *; }
-dontwarn org.spongycastle.**

2. 确保Provider正确注册

避免直接创建Provider实例,改用显式注册+指定Provider名称的方式,确保发布版中Provider生效:

import org.spongycastle.jce.provider.BouncyCastleProvider
import java.security.Security

fun createCertificate(): X509Certificate {
    // 检查并注册SpongyCastle Provider
    if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) {
        Security.addProvider(BouncyCastleProvider())
    }

    val keyPair = KeyPairGenerator.getInstance("RSA", BouncyCastleProvider.PROVIDER_NAME).genKeyPair()
    val subPubKeyInfo = SubjectPublicKeyInfo.getInstance(keyPair.public.encoded)
    val now = Instant.now()
    val validFrom = Date.from(now)
    val validTo = Date.from(now.plusSeconds(60L * 60 * 24 * 365))
    
    val certBuilder = X509v3CertificateBuilder(
        X500Name("CN=ZANTA,O=QANTA,L=NewYork,C=DE"),
        BigInteger.ONE,
        validFrom,
        validTo,
        X500Name("CN=ZANTA,O=QANTA,L=NewYork,C=DE"),
        subPubKeyInfo
    )

    // 使用SpongyCastle支持的算法名称,或尝试别名
    val signer = JcaContentSignerBuilder("SHA256WithRSA")
        .setProvider(BouncyCastleProvider.PROVIDER_NAME)
        .build(keyPair.private)

    return JcaX509CertificateConverter()
        .setProvider(BouncyCastleProvider.PROVIDER_NAME)
        .getCertificate(certBuilder.build(signer))
}

3. 尝试替换算法名称

SpongyCastle对算法名称的别名可能与标准不同,若仍报错,尝试替换为以下名称之一:

  • "SHA256withRSAEncryption"
  • "SHA256WITHRSAEncryption"

4. 确认依赖完整性

确保build.gradle中引入了完整的SpongyCastle依赖,发布版未被排除:

dependencies {
    implementation 'com.madgag.spongycastle:core:1.58.0.0'
    implementation 'com.madgag.spongycastle:prov:1.58.0.0'
}

内容的提问来源于stack exchange,提问作者Waqas Tahir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:35:49