java - OpenSSL 始终无法验证 Java 中 Bouncy CaSTLe 生成的签名

标签 java openssl rsa bouncycastle sha

我正在尝试从文件生成签名,以便客户端使用 OpenSSL 验证它们,因此使用 Bouncy CaSTLe 在 Java 中实现相应的 openSSL 命令:

openssl.exe dgst -sha256 -sign privateKey.pem -out \data.txt.sig \data.txt

使用 bouncy caSTLe 1.57 和 java,我们从文件中获取字节数组签名,我可以在代码中验证它。私有(private)、公共(public)和证书均由 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 是否能够直接验证字节签名数组,还是我遗漏了任何内容?

最佳答案

上面的代码工作正常,正在验证另一个文件的签名。出于学习目的而保留问题。

关于java - OpenSSL 始终无法验证 Java 中 Bouncy CaSTLe 生成的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56017754/

相关文章:

passwords - 如何在 PKCS#11 模块上使用私钥而不是 Perivate key 文件在 OpenSSL 中进行相互身份验证?

android - 在 Android 中加密,在 PHP 中使用 phpseclib 解密

java - E/Android运行时: FATAL EXCEPTION: main error in android studio

java - Sonar - 存储副本 - 不应直接存储或返回可变成员

linux - Makefile:3: *** 缺少分隔符。停止

Java RSA 加密不可重复?

java - 如何在RSA中加密?

java - 如何通过方法发送值

java - mongodb 中的全文搜索并按权重排序

OpenSSL 和 MS CryptoAPI : different digital signatures