OpenSSL 在 Java 中始终无法验证从 Bouncy Castle 生成的签名
OpenSSL always fails verifying signature generated from Bouncy Castle in Java
我正在尝试从文件生成签名,以便客户端使用 OpenSSL 验证它们,因此要使用 Bouncy Castle 在 Java 中实施相应的 openSSL 命令:
openssl.exe dgst -sha256 -sign privateKey.pem -out \data.txt.sig \data.txt
使用充气城堡 1.57 和 java,我们从文件中获取字节数组签名,我可以在代码中对其进行验证。私有、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 总是 "verification failure" 通过验证从代码生成的签名。
OpenSSL 是否能够直接验证字节签名数组,还是我遗漏了什么?
上面的代码工作正常,正在验证另一个文件的签名。为学习目的而保留的问题。
我正在尝试从文件生成签名,以便客户端使用 OpenSSL 验证它们,因此要使用 Bouncy Castle 在 Java 中实施相应的 openSSL 命令:
openssl.exe dgst -sha256 -sign privateKey.pem -out \data.txt.sig \data.txt
使用充气城堡 1.57 和 java,我们从文件中获取字节数组签名,我可以在代码中对其进行验证。私有、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 总是 "verification failure" 通过验证从代码生成的签名。
OpenSSL 是否能够直接验证字节签名数组,还是我遗漏了什么?
上面的代码工作正常,正在验证另一个文件的签名。为学习目的而保留的问题。