Мне удалось решить это самостоятельно! Оказалось, что во время развертывания 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.
Я использую следующий код, пожалуйста, обратите внимание на комментарии в самом коде:
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
вероятно, это проблема конфигурации среды?