Hola Álvaro,

  Lo único que se me ocurre ahora mismo es que el certPath este mal
formado, creo recordar que tuve problemas con esto hace tiempo, probad
a invertir el orden de los certificados en el certPath, podría ser la
causa del error y el motivo de que os validara con el de la FNMT ya
que para ese certificado solo aparece el del firmante en el certPath.

Saludos,

2010/11/15 Álvaro Suárez Fidalgo <[email protected]>:
> Hola, estamos utilizando la clase CMSSignatureVerifier para verificar la
> firma CMS, y solo es capaz de verificar la firma cuando ésta es realizada
> con un certificado personal de la FNMT mientras que si la firma se realiza
> mediante DNIe no es capaz de verificarla. En el código de la clase
> CMSSignatureVerifier entra en verifyAgainstCA por lo que el formato de la
> firma y su composición deducimos que es válido pero a la hora de crear los
> parámetros para validar la firma realizada con el DNI no es capaz de
> hacerlo, mostrando siempre la siguiente excepción:
> "Trust anchor for certification path not found"
> El certPath contiene el certificado del DNIe con el que se ha firmado y el
> certificado de la CA con la que se ha firmado (ACDNIE001-SHA1.crt) mientras
> que el trust anchor lo ceramos con el certificado de la CA
> ACDNIE001-SHA1.crt
> Haciendo eso exactamente igual con el de la FNMT funciona, sin embargo con
> el DNIe salta la excepción comentada anteriormente. ¿Alguna sugerencia?
> El código de CMSSignatureVerifier que estamos utilizando es el siguiente (lo
> hemos modificado ligeramente):
>
> package es.uji.security.crypto.cms;
>
> import java.io.FileWriter;
> import java.io.IOException;
> import java.io.PrintWriter;
> import java.security.InvalidAlgorithmParameterException;
> import java.security.NoSuchAlgorithmException;
> import java.security.NoSuchProviderException;
> import java.security.Provider;
> import java.security.cert.CertPath;
> import java.security.cert.CertPathValidator;
> import java.security.cert.CertPathValidatorException;
> import java.security.cert.CertPathValidatorResult;
> import java.security.cert.CertStore;
> import java.security.cert.CertStoreException;
> import java.security.cert.Certificate;
> import java.security.cert.CertificateException;
> import java.security.cert.CertificateFactory;
> import java.security.cert.PKIXParameters;
> import java.security.cert.TrustAnchor;
> import java.security.cert.X509Certificate;
> import java.util.ArrayList;
> import java.util.Collection;
> import java.util.HashSet;
> import java.util.Iterator;
> import java.util.List;
> import java.util.Set;
>
> import org.bouncycastle.cms.CMSException;
> import org.bouncycastle.cms.CMSProcessableByteArray;
> import org.bouncycastle.cms.CMSSignedData;
> import org.bouncycastle.cms.SignerId;
> import org.bouncycastle.cms.SignerInformation;
> import org.bouncycastle.cms.SignerInformationStore;
>
>
> public class CMSSignatureVerifier
> {
>
>
>     private boolean verifyAgainstCA(X509Certificate[] caCertificates,
> CertStore certs,
>             Provider provider) throws CertStoreException,
> InvalidAlgorithmParameterException,
>             NoSuchAlgorithmException, CertificateException,
> CertPathValidatorException, IOException
>     {
>
>         try{
>
>             for (int i=0;i<caCertificates.length;i++){
>                 List<Certificate> certChain = new ArrayList<Certificate>();
>                 if (caCertificates.length > 0)
>                 {
>                     certChain.add(rootCert);
>                 }
>
>                 //certificado de firma del mensaje
>                 Collection<? extends Certificate> certCollection =
> certs.getCertificates(null);
>                 for (Certificate c : certCollection)
>                 {
>                     certChain.add(c);
>                 }
>
>                 Set<TrustAnchor> trust = new HashSet<TrustAnchor>();
>                 CertPath certPath = null;
>                 certPath = CertificateFactory.getInstance("X.509",
> provider).generateCertPath(certChain);
>                 pw2.println("CertPath: "+certPath.toString());
>
>                 for (int k=0; k<certChain.size();k++){
>                     if (!trust.isEmpty()){
>                         trust.clear();
>                     }
>                     X509Certificate certificado = (X509Certificate)
> certChain.get(k);
>                     trust.add(new TrustAnchor(certificado, null));
>                     try {
>                         PKIXParameters param = new PKIXParameters(trust);
>                         param.setSigProvider("BC");
>                         param.setRevocationEnabled(false);
>                         param.setTrustAnchors(trust);
>                         CertPathValidator cpv =
> CertPathValidator.getInstance("PKIX", provider);
>                         CertPathValidatorResult r = cpv.validate(certPath,
> param);
>                         return true;
>                     }
>                     catch(Exception e){
>                           System.out.println(e.getMessage());
>                     }
>                 }
>             }
>         }
>         catch(Exception e){
>                   System.out.println(e.getMessage());
>         }
>         return false;
>     }
>
>     /**
>      *
>      * Check the signature is correct, conform to plain data and the
> certificate chain is ok
>      *
>      * @throws CertPathValidatorException
>      * @throws CertificateException
>      * @throws InvalidAlgorithmParameterException
>      *
>      */
>
>     @SuppressWarnings("unchecked")
>     public boolean verify(byte[] data, byte[] signedData, X509Certificate[]
> caCertificates,
>             Provider provider) throws NoSuchProviderException,
> NoSuchAlgorithmException, CertStoreException, CMSException,
> InvalidAlgorithmParameterException, CertificateException,
> CertPathValidatorException, IOException
>     {
>
>         try{
>             CMSProcessableByteArray processableByteArray = new
> CMSProcessableByteArray(data);
>             CMSSignedData cmsSignedData = new
> CMSSignedData(processableByteArray, signedData);
>             CertStore certs =
> cmsSignedData.getCertificatesAndCRLs("Collection", provider);
>             SignerInformationStore signers = cmsSignedData.getSignerInfos();
>             Collection<SignerInformation> c = signers.getSigners();
>
>             boolean result = false;
>
>             for (SignerInformation signer : c)
>             {
>
>                 SignerId signerId = signer.getSID();
>                 Collection certCollection = certs.getCertificates(signerId);
>
>                 Iterator certIt = certCollection.iterator();
>                 X509Certificate cert = (X509Certificate) certIt.next();
>                 //validacion del mensaje cms (certificado y mensaje cifrado)
>                 result = signer.verify(cert, provider);
>
>                 //mensaje valido
>                 if (result)
>                 {
>                     //se comprueba que aceptamos la firma
>                     result = verifyAgainstCA(caCertificates, certs,
> provider);
>                     return result;
>                 }
>                 else
>                 {
>                     return false;
>                 }
>             }
>
>         }
>         catch(Exception e){
>             return false;
>         }
>
>         return false;
>
>     }
> }
>
>
> _______________________________________________
> CryptoApplet mailing list
> [email protected]
> http://llistes.uji.es/mailman/listinfo/cryptoapplet
>
>



-- 
Paúl Santapau Nebot
http://es.linkedin.com/pub/paul-santapau/4/53a/a99
Twitter: @psantapau
_______________________________________________
CryptoApplet mailing list
[email protected]
http://llistes.uji.es/mailman/listinfo/cryptoapplet

Responder a