Я пытаюсь сгенерировать подписи из файлов, чтобы проверить их клиентами, использующими OpenSSL, поэтому реализовать соответствующую команду openSSL в Java, используя Bouncy Castle:
openssl.exe dgst -sha256 -sign privateKey.pem -out \data.txt.sig \data.txt
, используя bouncy castle 1.57 иJava, мы получаем подпись байтового массива из файла, который я мог проверить это в коде.Приватный, публичный и сертификат генерируются из openSSL.
, чтобы сгенерировать сертификаты:
прочитать секретный ключ из файла закрытого ключа pem:
PEMParser pemParser = new PEMParser(new FileReader(PRIVATE_FILE_PATH));
PKCS8EncryptedPrivateKeyInfo encryptedPrivateKeyInfo = (PKCS8EncryptedPrivateKeyInfo) pemParser.readObject();
JceOpenSSLPKCS8DecryptorProviderBuilder jce = new JceOpenSSLPKCS8DecryptorProviderBuilder();
jce.setProvider("BC");
InputDecryptorProvider decProv = jce.build(password.toCharArray());
PrivateKeyInfo info = encryptedPrivateKeyInfo.decryptPrivateKeyInfo(decProv);
JcaPEMKeyConverter pemKeyConverter = new JcaPEMKeyConverter();
PrivateKey pk = pemKeyConverter.getPrivateKey(info);
и сгенерировать RSAПодпись SHA 256 и запишите результат в файл подписи:
byte[] data = Files.readAllBytes(Paths.get(txtFileToSignPath));
Signature sig = Signature.getInstance("SHA256withRSA");
sig.initSign(pk);
sig.update(data);
byte[] signature = sig.sign();
FileOutputStream dfis = new FileOutputStream(SignaturefilePath);
dfis.write(bytesToWrite);
dfis.close();
программно я могу проверить подписи, сгенерированные из кода выше, а также из открытого SSL:
Signature verifySignature = Signature.getInstance("SHA256withRSA");
byte[] signatureBytes =
Files.readAllBytes(Paths.get(SignaturefilePath);
verifySignature.initVerify(getPublicKeyFromCertFile(CERT_PEM));
verifySignature.update(data);
verifySignature.verify(signatureBytes);
с другой стороны, openSSL всегда получает «ошибку проверки», проверяя подписи, сгенерированные из кода.
Может ли OpenSSL проверить массив байтов подписей напрямую или я что-то упустил?