2012-02-15 6 views
0

私は1つのプロジェクトで問題に直面しています。BouncyCastleでデジタル署名を作成しようとしています。 。ここで実装の構築中にエラーが発生する(アルゴリズム:コレクション、プロバイダー:BC、クラス:org.bouncycastle.jce.provider.CertStoreCollectionSpi)

は、私が実行しているコードです:

Statement stmt_cert = conn.createStatement(); 
ResultSet rs_cert= stmt_cert.executeQuery("select c.ca, c.privk from certs c where num_tab="+stat_cert); 
rs_cert.next(); 
castr = rs_cert.getString("ca") + "\n"; 
strPriv = rs_cert.getString("privk") + "\n" ; 
rs_cert.close();  
stmt_cert.close(); 
byte[] encKey = castr.getBytes(); 
CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
X509Certificate caCert = (X509Certificate)cf.generateCertificate(new ByteArrayInputStream(encKey)); 

PEMReader pr = new PEMReader(new StringReader(strPriv)); 
Object obj = pr.readObject(); 
KeyPair kp = (KeyPair) obj; 
PrivateKey privateKey = kp.getPrivate(); 
Certificate[] chain =new Certificate[]{caCert}; 


    byte[] plainText = digest.getBytes("UTF8"); 


    CertStore certs =null; 
    ArrayList certList = new ArrayList(); 

    try{ 
    for (int i = 0; i < chain.length;i++) 
    {  
     result += chain[i]; 
     certList.add(chain[i]);  
    } 
    certs = CertStore.getInstance("Collection", new CollectionCertStoreParameters(certList), "BC"); 


    } 
    catch(Exception exc){ 
    result += "Problem with keystore access: " + exc.toString() ; 
    InsErr_log.Insert_error(1000,"Error when generate Signature of Statements",result);  
    return result; 
    } 

    // --- Use Bouncy Castle provider to create CSM/PKCS#7 signed message --- 
    try{ 
    CMSSignedDataGenerator signGen = new CMSSignedDataGenerator(); 
    signGen.addSigner(privateKey, (X509Certificate)caCert, CMSSignedDataGenerator.DIGEST_SHA1); 
    signGen.addCertificatesAndCRLs(certs); 
    CMSProcessable content = new CMSProcessableByteArray(plainText); 

    CMSSignedData signedData = signGen.generate(content,"BC"); 
    byte[] signeddata = signedData.getEncoded(); 
    result += "Created signed message: " + signeddata.length + " bytes" ; 
    result += new String(signeddata,"UTF8"); 
    } 
    catch(Exception ex){ 
    result = "Couldn't generate CMS signed message\n" + ex.toString() ; 
    }  

問題は、このコード行から来ている:

certs = CertStore.getInstance("Collection", new CollectionCertStoreParameters(certList), "BC"); 

、ここではエラーです:

Problem with keystore access: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Collection, provider: BC, class: org.bouncycastle.jce.provider.CertStoreCollectionSpi)

私は」初心者ですので、私と一緒にご負担ください、どんな情報も高く評価されます!

答えて

1

私は自分でこの問題を解決することができました。 bcmail-jdk14-146.jarとbcprov-jdk14-146.jarをデプロイしているうちに、旧バージョンのjce-jdk13-131.jarが削除されていて、それ以降はすべて正常に動作し、管理できたことが判明しました。署名を置く!

しかし、私はbcmail-jdk14-146.jarとbcprov-jdk14-146.jarの組み合わせを使用して確認できません! bcmail-jdk13-131.jarとjce-jdk13-131.jarの組み合わせでのみ検証されます。

私は、次のコードを使用し

、Plsはコード自体のコメントに注意してください。

public static boolean verify (byte[] bytes, byte[] bytessig, long userID, int stat_sign) throws Exception 
    { 
    boolean result = false; 
    boolean bcert = false; 
    boolean bsign=false; 

    try { 

     CMSSignedData s; 
     ByteArrayInputStream bIn = new ByteArrayInputStream(bytessig); 
     ASN1InputStream  aIn = new ASN1InputStream(bIn); 
     s = new CMSSignedData(new CMSProcessableByteArray(bytes),ContentInfo.getInstance(aIn.readObject())); 
     //CertStore certs = s.getCertificatesAndCRLs("Collection", "BC"); 
     //Im not using the above line but if I uncomment it with bcmail-jdk14-146.jar and bcprov-jdk14-146.jar 
     //cert is correctly filled with 
     //the public key of the signer however verification fails with 
     //message-digest attribute value does not match calculated value 

     SignerInformationStore signers = s.getSignerInfos(); 
     Collection    c = signers.getSigners(); 
     CollectionCertStoreParameters ccsp = new CollectionCertStoreParameters(c); 
     CertStore certs = CertStore.getInstance("Collection", ccsp, "BC"); 

     Iterator    it = c.iterator(); 
     if (it.hasNext()) 
     { 
      SignerInformation signer = (SignerInformation)it.next(); 
      Collection   certCollection = certs.getCertificates(signer.getSID()); 
      //This is the point where Empty Collection is returned in 1.4 
      Iterator   certIt = certCollection.iterator(); 

      X509Certificate  cert = (X509Certificate)certIt.next(); 
      //with bcmail-jdk14-146.jar and bcprov-jdk14-146.jar cert is empty 
      //and throws : java.util.NoSuchElementException on (X509Certificate)certIt.next(); 
      //while in bcmail-jdk13-131.jar and jce-jdk13-131.jar it verifies correctly 

      bsign=signer.verify(cert, "BC"); 
     } 
        return bsign; 
    } 
    catch(Exception e) { 
     e.printStackTrace(); 
     return false; 
    } 
    } 

私は意味をなさないし、本当にあなたがbcmail-jdk14-とのメッセージを確認するために私を助けることができれば幸いです願っています146.jarとbcprov-jdk14-146.jarは、これらのライブラリを使用してメッセージに署名します。

PS:私は他のいくつかのいずれかが同じ問題 http://www.ibm.com/developerworks/forums/thread.jspa?messageID=14124014 おそらくその環境の構成に問題があることをここで見つけましたか?

+0

コメントを外して次の行を使用して動作させました。 CertStore certs = s.getCertificatesAndCRLs( "Collection"、 "BC"); CertStore certs = CertStore.getInstance( "Collection"、ccsp、 "BC"); ではなく、 このメソッドは廃止されましたが、少なくとも機能することを示しています。 – Tsonev