Estoy trabajando en la implementación de XAdES para Java, por lo que necesito una implementación criptográfica para poder verificar los certificados en el pasado.
Lamentablemente tengo problemas para verificar los certificados revocados. La situación se ve así:
(time)
↑
| ← in 1d: CA and user certificate notAfter date
|
| ← *now*: user certificate validation using time from time stamp (12h ago)
|
| ← 1h ago: CRL publishing
|
| ← 6h ago: user certificate revocation (reason: unknown)
|
| ← 12h ago: signature creation and time stamping
|
| ← 1 day ago:
| CA notBefore Date
| user notBefore Date
El proveedor de servicios criptográficos de Sun ( X509CRLSelector
) no puede usar CRL de "futuro", por lo que la validación con CRL se publicó hace 1 h cuando la fecha de verificación es 12 h en el pasado. Este comportamiento es completamente incorrecto para mi caso de uso, ya que la ley polaca requiere un período de gracia de 1 hora entre el sello de tiempo de firma y la publicación de CRL antes de que el documento pueda validarse por completo.
Al usar el proveedor criptográfico Bouncy Castle, el problema X509CRLSelector
es corregido , pero cuando lo intento Para validar el certificado revocado, obtengo un seguimiento de pila adjunto.
¿Entiendo que la validación de certificado con la revocación es incorrecta (y que el error de BC es el comportamiento correcto) o es incorrecto este comportamiento de CertPathBuilder?
xades4j.providers.CannotBuildCertificationPathException: Certification path could not be validated. at xades4j.providers.impl.PKIXCertificateValidationProvider.validateWithParams(PKIXCertificateValidationProvider.java:272) at xades4j.providers.impl.PKIXCertificateValidationProvider.validate(PKIXCertificateValidationProvider.java:235) at xades4j.verification.XadesVerifierImpl.verify(XadesVerifierImpl.java:175) at xades4j.verification.AgedTimeStampTest.verifySignature(AgedTimeStampTest.java:339) at xades4j.verification.AgedTimeStampTest.testT_3v(AgedTimeStampTest.java:287) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41) at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) at org.junit.runners.ParentRunner.run(ParentRunner.java:220) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Caused by: java.security.cert.CertPathBuilderException: Certification path could not be validated. at org.bouncycastle.jce.provider.PKIXCertPathBuilderSpi.engineBuild(PKIXCertPathBuilderSpi.java:112) at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238) at xades4j.providers.impl.PKIXCertificateValidationProvider.validateWithParams(PKIXCertificateValidationProvider.java:268) ... 28 more Caused by: org.bouncycastle.jce.exception.ExtCertPathValidatorException: Certificate revocation after Thu Oct 18 08:46:09 CEST 2012, reason: unspecified at org.bouncycastle.jce.provider.RFC3280CertPathUtilities.processCertA(RFC3280CertPathUtilities.java:1516) at org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi.engineValidate(PKIXCertPathValidatorSpi.java:274) at java.security.cert.CertPathValidator.validate(CertPathValidator.java:250) at org.bouncycastle.jce.provider.PKIXCertPathBuilderSpi.build(PKIXCertPathBuilderSpi.java:195) at org.bouncycastle.jce.provider.PKIXCertPathBuilderSpi.engineBuild(PKIXCertPathBuilderSpi.java:105) ... 30 more Caused by: org.bouncycastle.jce.provider.AnnotatedException: Certificate revocation after Thu Oct 18 08:46:09 CEST 2012, reason: unspecified at org.bouncycastle.jce.provider.RFC3280CertPathUtilities.checkCRLs(RFC3280CertPathUtilities.java:2013) at org.bouncycastle.jce.provider.RFC3280CertPathUtilities.processCertA(RFC3280CertPathUtilities.java:1506) ... 34 more
El tiempo de validación para este seguimiento de pila fue Thu Oct 18 02:46:07 CEST 2012