С помощью этого метода можно подписать хэш файла, а на проверку отправлять сам файл, и все будет корректно проверятся. То есть мы пропускаем хэширование хэша внутри метода.
/**
* Реализоываем метод сами, так как необходимо подписывать хэш
* и пропускать стадию хэширования внутри метод подписания
*/
private static String createCMSSignatureFromHash(String storageName,
String storagePath, String alias, String password, String dataToSign)
throws Exception {
KeyStore keyStore = null;
ResultWrapper rw;
byte[] dataToSignByte = Hex.decode(dataToSign);
Storage storage = Storage.get(storageName);
keyStore = KeyStoreUtil.getKeyStore(storage, storagePath,
password.toCharArray(), getProvider());
X509Certificate cert = (X509Certificate) keyStore.getCertificateChain(alias)[0];
PrivateKey privateKey = KeyStoreUtil.getPrivateKey(storage,
storagePath, alias, password.toCharArray(), getProvider());
CertStore chainStore = CertStore.getInstance("Collection",
new CollectionCertStoreParameters(Arrays.asList(cert)),
getProvider().getName());
CMSSignedDataGenerator generator = new CMSSignedDataGenerator();
Attribute attr = new Attribute(CMSAttributes.messageDigest, new DERSet(new DEROctetString(dataToSignByte)));
Attribute attrContentType = new Attribute(CMSAttributes.contentType, new DERSet(CMSObjectIdentifiers.data));
ASN1EncodableVector vector = new ASN1EncodableVector();
vector.add(attr);
vector.add(attrContentType);
String alg = null;
if (cert.getSigAlgOID().equals(PKCSObjectIdentifiers.sha1WithRSAEncryption.getId()))
alg = CMSSignedDataGenerator.DIGEST_SHA1;
else if (cert.getSigAlgOID().equals(PKCSObjectIdentifiers.sha256WithRSAEncryption.getId()))
alg = CMSSignedDataGenerator.DIGEST_SHA256;
else if (cert.getSigAlgOID().equals(KNCAObjectIdentifiers.gost34311_95_with_gost34310_2004.getId()))
alg = CMSSignedDataGenerator.DIGEST_GOST34311_95;
else if (cert.getSigAlgOID().equals(CryptoProObjectIdentifiers.gostR3411_94_with_gostR34310_2004.getId()))
alg = CMSSignedDataGenerator.DIGEST_GOST3411_GT;
generator.addSigner(privateKey, cert, alg, new AttributeTable(vector), null);
generator.addCertificatesAndCRLs(chainStore);
CMSSignedData s = generator.generate(CMSSignedDataGenerator.DATA, null, false, getProvider().getName());
byte[] signedDataEncoded = s.getEncoded();
return new String(Base64.encode(signedDataEncoded), "ASCII");
}