Как проверить цифровые подписи файла с помощью BouncyCastle и Java
Всем привет! В настоящее время я работаю над «преобразованием» команды openssl в код Java для проверки цифровых подписей. Что у меня есть: я получаю несколько файлов с расширением .tar и соответствующие отдельные подписи с расширением .sig в котором хранится инфо о пакете и сертификате. Sig-файлы имеют двоичный (DER) формат. Кроме того, у меня есть два сертификата, которые использовались для подписи файлов tar. Сами файлы сертификатов имеют формат P12 или Yubi. Вот следующая команда openssl для проверки:
openssl cms -verify -binary -md sha256 -in filename.sig -inform DER -content filename.tar -out filename.dump -CAfile packagesign.pem
а вот так генерируется сама подпись файла:
openssl cms -sign -binary -md sha256 -in filename.tar -outform der -out filename.sig -signer packagesign.pem -keyopt rsa_padding_mode:pss
Мне нужно реализовать проверку с помощью библиотеки Bouncy Castle. Может ли кто-нибудь помочь мне с примерами кода или шагами о том, как выполнить такую операцию проверки подписи и получить результаты проверки.
Так как нету опыта работы с сертифкатами и библиотека не знакома, то изначально пытаюсь осуществить проверку с помощью следуешего кода
public static boolean verifSignedData(String signed_file_name, X509Certificate signercert) throws IOException
{
boolean result = false;
Security.addProvider(new BouncyCastleProvider());
byte [] signedData = FileUtils.readFileToByteArray(new File(signed_file_name));
try {
CMSSignedData cmsSignedData = new CMSSignedData(signedData);
Collection<SignerInformation> signers = cmsSignedData.getSignerInfos().getSigners();
X509CertificateHolder ch = new X509CertificateHolder(signercert.getEncoded());
for (SignerInformation signer : signers) {
LOG.info("AlgorithmId: {} serial: {}", signer.getDigestAlgOID(), signer.getSID().getSerialNumber());
if (signer.getSID().match(ch))
if (signer.verify(new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(ch)))
result=true;
}
} catch (Exception e) {
LOG.error("",e);
}
return result;
}
но при verify получаю ошибку
message-digest attribute value does not match calculated value
Спасибо