Sto lavorando all'implementazione XAdES per Java, in quanto tale ho bisogno di un'implementazione crittografica per poter verificare i certificati in passato.
Purtroppo ho problemi a verificare i certificati revocati. La situazione è la seguente:
(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
Il provider di crittografia di Sun ( X509CRLSelector
) non può utilizzare CRL da "future", quindi la convalida mediante CRL è stata pubblicata 1 ora fa quando la data di verifica è 12 ore in caso di esito negativo. Questo comportamento è completamente sbagliato per il mio caso di utilizzo in quanto la legge polacca richiede un periodo di grazia di 1 ora tra la data e l'ora della firma e la pubblicazione CRL prima che il documento possa essere completamente convalidato.
Quando utilizzi il provider di crittografia di Bouncy Castle, il problema di X509CRLSelector
è corretto , ma quando provo per convalidare il certificato revocato mi viene allegata la traccia dello stack.
Comprendo la convalida dei certificati con revoca errata (e l'errore BC è un comportamento corretto) o il comportamento di CertPathBuilder è sbagliato?
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
Il tempo di convalida per questo stacktrace era Thu 18 ottobre 02:46:07 CEST 2012