2017-05-16 4 views
0

Wenn ich meine Signatur mit BouncyCastle überprüfen möchte, komme ich nicht in die zweite while Schleife der verifySignature Methode. Die store.getMatches() gibt ein leeres Array zurück.Unterschrift kann nicht überprüft werden (cmssigneddata) bouncycastle

public static CMSSignedData sign() throws Exception { 
    byte[] file = fileChooser(); 
    store = KeyStore.getInstance(storeType); 
    FileInputStream in = new FileInputStream(new File(storePathKey)); 
    store.load(in, storePassword); 
    in.close(); 

    Key priv = store.getKey("Subject", storePassword); 
    System.out.println(priv.toString() + "priv string"); 
    X509Certificate cert = (X509Certificate) store.geCertificate("Subject"); 
    ContentSigner signer = new JcaContentSignerBuilder(sigAlgo).build((RSAPrivateKey) priv); 

    CMSTypedData data = new CMSProcessableByteArray(file); 
    CMSSignedDataGenerator gen = new CMSSignedDataGenerator(); 
    gen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().build()) 
     .build(signer, cert)); 
    CMSSignedData sigData = gen.generate(data, true); 

    return sigData; 
} 

public static void verifySig(CMSSignedData sigData) throws Exception { 
    Store store = sigData.getCertificates(); 
    SignerInformationStore signers = sigData.getSignerInfos(); 
    System.out.println(store.toString() + "store"); 
    Collection c = signers.getSigners(); 
    Iterator it = c.iterator(); 

    while (it.hasNext()) { 
     System.out.println("enter while loop1"); 
     SignerInformation signer = (SignerInformation) it.next(); 

     Collection certCollection = store.getMatches(signer.getSID()); 
     Iterator certIt = certCollection.iterator(); 
     System.out.println(store.getMatches(null) + "collection of certs"); 

     while (certIt.hasNext()) { 
      System.out.println("enter while loop2"); 
      X509CertificateHolder certHolder = (X509CertificateHolder) certIt.next(); 
      X509Certificate cert = new JcaX509CertificateConverter().getCertificate(certHolder); 

      if (signer.verify(new JcaSimpleSignerInfoVerifierBuilder().build(cert))) { 
       System.out.println("verified correct"); 
      } else { 
       System.out.println("not verified"); 
      } 
     } 
    } 
} 

Fehle ich etwas in der sign() Methode?

Antwort

1

Sie müssen das Zertifikat zu einem org.bouncycastle.util.CollectionStore hinzufügen und diesen Speicher der Signatur hinzufügen.

Ich verwende BouncyCastle 1,56:

import org.bouncycastle.cert.X509CertificateHolder; 
import org.bouncycastle.util.CollectionStore; 

// add these lines after gen.addSignerInfoGenerator(...) 

// cert is your X509Certificate 
X509CertificateHolder holder = new X509CertificateHolder(cert.getEncoded()); 
CollectionStore<X509CertificateHolder> certStore = new CollectionStore<>(Collections.singletonList(holder)); 
gen.addCertificates(certStore); // add the store to the signature 

Die CollectionStore nützlich ist, wenn Sie mehr als ein Zertifikat hinzufügen möchten. Wenn Sie nur eine hinzufügen möchten, können Sie auch tun:

X509CertificateHolder holder = new X509CertificateHolder(cert.getEncoded()); 
gen.addCertificate(holder); 

Der Ausgang ich habe:

enter while loop1 
[[email protected]]collection of certs 
enter while loop2 
verified correct 
Verwandte Themen