我在Android 6.0及更高版本上验证使用SHA384与ECDSA签名的证书时出现问题。但是,它适用于Android 4.1 - 5.1。我将其跟踪到Certificate类中的错误。验证方法中抛出异常:
java.lang.RuntimeException: error:0f092074:elliptic curve routines:ec_asn1_pkparameters2group:NON_NAMED_CURVE
知道为什么Android 6.0会发生这种情况以及如何解决这个问题?我已经使用Spongycastle作为安全提供程序对其进行了测试,但验证函数始终抛出异常。
谢谢&此致
答案 0 :(得分:4)
终于找到了问题 - 不是签名本身的验证是问题,而是加载了保存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:
这导致了一个问题 - 为什么BoringSSL在解码此证书中的公钥时出现问题?我想这应该是BoringSSL中的一个错误。我用OpenSSL检查了证书,没有问题。
当加载中间证书并稍后验证文档签名证书的签名时明确使用Spongycastle Provider时,一切正常。
答案 1 :(得分:0)
我在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.access$1600(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')