Android 6 上 ecdsa-with-SHA384 的签名验证问题

Signature verification problems for ecdsa-with-SHA384 on Android 6

我在 Android 6.0 及更高版本上验证使用 SHA384 的 ECDSA 签名的证书时遇到问题。但是,它适用于 Android 4.1 - 5.1。我追踪到它是证书 class 中的一个错误。 verify方法抛出异常:

java.lang.RuntimeException: error:0f092074:elliptic curve routines:ec_asn1_pkparameters2group:NON_NAMED_CURVE

知道为什么 Android 6.0 会发生这种情况吗?如何解决?我已经使用 Spongycastle 作为安全提供程序对其进行了测试,但验证函数总是抛出该异常。

感谢和问候

终于找到了问题 - 不是签名验证本身的问题,而是加载包含 ec public 密钥的中间证书的问题。

    Subject Public Key Info:
        Public Key Algorithm: id-ecPublicKey
        Unable to load Public Key
2536673920:error:0f092074:elliptic curve routines:ec_asn1_pkparameters2group:NON_NAMED_CURVE:external/boringssl/src/crypto/ec/ec_asn1.c:225:
2536673920:error:0f07f076:elliptic curve routines:d2i_ECPKParameters:PKPARAMETERS2GROUP_FAILURE:external/boringssl/src/crypto/ec/ec_asn1.c:253:
2536673920:error:0f08000f:elliptic curve routines:d2i_ECParameters:elliptic curve routines:external/boringssl/src/crypto/ec/ec_asn1.c:503:
2536673920:error:0608808f:public key routines:eckey_type2param:DECODE_ERROR:external/boringssl/src/crypto/evp/p_ec_asn1.c:140:
2536673920:error:0608600f:public key routines:eckey_pub_decode:elliptic curve routines:external/boringssl/src/crypto/evp/p_ec_asn1.c:180:
2536673920:error:0b07c07c:X.509 certificate routines:X509_PUBKEY_get:PUBLIC_KEY_DECODE_ERROR:external/boringssl/src/crypto/x509/x_pubkey.c:168:

这引出了一个问题 - 为什么 BoringSSL 在解码此证书中的 public 密钥时遇到问题?我想这一定是 BoringSSL 中的错误。我用 OpenSSL 检查了证书,那里没有问题。

当加载中间证书并稍后验证文档签名证书的签名时显式使用 Spongycastle Provider 时,一切正常。

我 运行 在 Android 6.0 上遇到了同样的问题。明确使用 Spongycastle Provider 似乎没有帮助,除非我做错了什么。这是堆栈跟踪:

W/System.err: java.lang.RuntimeException: error:0f092074:elliptic curve routines:ec_asn1_pkparameters2group:NON_NAMED_CURVE
W/System.err:     at com.android.org.conscrypt.NativeCrypto.X509_get_pubkey(Native Method)
W/System.err:     at com.android.org.conscrypt.OpenSSLX509Certificate.getPublicKey(OpenSSLX509Certificate.java:418)
W/System.err:     at org.spongycastle.jce.provider.CertPathValidatorUtilities.findTrustAnchor(CertPathValidatorUtilities.java:182)
W/System.err:     at org.spongycastle.jce.provider.PKIXCertPathValidatorSpi.engineValidate(PKIXCertPathValidatorSpi.java:95)
W/System.err:     at java.security.cert.CertPathValidator.validate(CertPathValidator.java:193)
W/System.err:     at ***.(***.java:##)
W/System.err:     at android.app.Activity.dispatchActivityResult(Activity.java:7137)
W/System.err:     at android.app.ActivityThread.deliverResults(ActivityThread.java:4916)
W/System.err:     at android.app.ActivityThread.handleSendResult(ActivityThread.java:4963)
W/System.err:     at android.app.ActivityThread.access00(ActivityThread.java:221)
W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1848)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err:     at android.os.Looper.loop(Looper.java:158)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:7224)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

在 Android 9.0 上它又可以工作了,但我仍然想让它在 6.0 上工作。它在 certPathValidator.validate():

上失败
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
// keyStore = KeyStore.getInstance("BKS", "BC"); // explicitly use BC - also fails
// [...] populate key store
PKIXParameters params = new PKIXParameters(keyStore);
CertPathValidator certPathValidator = CertPathValidator.getInstance(CertPathValidator.getDefaultType()); // CertPathValidator.getDefaultType() = PKIX
PKIXCertPathValidatorResult pkixCertPathValidatorResult = (PKIXCertPathValidatorResult) certPathValidator.validate(certPath, params);

我正在使用这些库:

implementation files('libs/core-1.58.0.0.jar')
implementation files('libs/prov-1.58.0.0.jar')
implementation files('libs/pkix-1.54.0.0.jar')
implementation files('libs/bcprov-jdk15on-1.64.jar')
implementation files('libs/bcpkix-jdk15on-1.64.jar')