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

Rom*_*ski 5 java verify x509certificate android-6.0-marshmallow

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

java.lang.RuntimeException: error:0f092074:elliptic curve routines:ec_asn1_pkparameters2group:NON_NAMED_CURVE
Run Code Online (Sandbox Code Playgroud)

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

感谢和问候

Rom*_*ski 5

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

    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:
Run Code Online (Sandbox Code Playgroud)

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

当在加载中间证书并稍后验证文档签名证书的签名时明确使用 Spongycastle 提供程序时,一切正常。