Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenSSL总是无法验证Java中Bouncy Castle生成的签名_Java_Openssl_Rsa_Bouncycastle_Sha - Fatal编程技术网

OpenSSL总是无法验证Java中Bouncy Castle生成的签名

OpenSSL总是无法验证Java中Bouncy Castle生成的签名,java,openssl,rsa,bouncycastle,sha,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,我们从文件中获得字节数组签名,我可以在代码中验证它。私有、公共和证书是从openSSL生成的 因此,要生成证书: 从pem私钥文件中读取私钥: 生成

我正在尝试从文件中生成签名,以便客户端使用OpenSSL对其进行验证,以便使用Bouncy Castle在Java中实现相应的OpenSSL命令:

openssl.exe dgst -sha256 -sign privateKey.pem -out \data.txt.sig \data.txt
使用bouncy castle 1.57和java,我们从文件中获得字节数组签名,我可以在代码中验证它。私有、公共和证书是从openSSL生成的

因此,要生成证书:

从pem私钥文件中读取私钥:

生成RSA SHA 256签名,并将结果写入签名文件:

通过编程,我可以验证从上述代码以及从开放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是否能够直接验证字节数组签名,或者我是否遗漏了任何内容?

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

我认为openssl需要签名是字节的十六进制表示形式使用org.bouncycastle.util.encoders.hex.encode()编码字节[]的签名数组并不能解决问题:-(仍然无法验证)。@JEY:no,
openssl dgst-verify
不使用十六进制;事实上,从2015年的1.0.2开始,它就有一个注释(在末尾)特别强调它不起作用。阿明:是的,这应该起作用,对我来说也是。要缩小范围,请尝试
openssl rsautl-verify-inkey$certfile-certin-in$sigfile-out$tempfile
并查看是否在输出文件中收到错误消息(以及什么)或数据(以及什么);特别是查看输出数据是否看起来像SHA256的ASN.1/DER DigestInfo和一些哈希值,如果是,则将该哈希值与(断言的)的哈希值进行比较data.Hi@dave_thompson_085,感谢您的回复!事实上,这只是我这边的一个错误,我正在根据另一个文件验证签名,结果是正确的。我将保留问题,以供学习。这是一个注释,而不是答案。您可以在问题下添加此信息。
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();
Signature verifySignature = Signature.getInstance("SHA256withRSA"); 
byte[] signatureBytes =  
Files.readAllBytes(Paths.get(SignaturefilePath);
verifySignature.initVerify(getPublicKeyFromCertFile(CERT_PEM));
verifySignature.update(data);
verifySignature.verify(signatureBytes);