gpt4 book ai didi

java - 我的代码可以验证自签名证书,但在使用 VeriSign 颁发的证书时失败

转载 作者:行者123 更新时间:2023-12-01 12:21:55 30 4
gpt4 key购买 nike

我的应用程序正在使用 java 安全 API 来签署文件并验证它。在签名时,我使用 PFX 文件和密码作为输入,签名后我使用字节生成签名文件。在验证过程中,我使用签名文件、证书文件和签名文件作为输入。请在下面找到我在验证中使用的代码:

 // KeyFilePath= path of certificate file
// fileToVerify = path of signed file
// signatureFilePath = path of signature file



InputStream inputStream = new FileInputStream(KeyFilePath);
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
X509Certificate x509Certificate = (X509Certificate) certificateFactory.generateCertificate(inputStream);

// input the signature bytes
String sigFile = signatureFilePath;

FileInputStream sigFileInputStream = new FileInputStream(sigFile);
byte[] sigToVerify = new byte[sigFileInputStream.available()];
sigFileInputStream.read(sigToVerify);
sigFileInputStream.close();

PublicKey pubKey = x509Certificate.getPublicKey();
Signature signature = Signature.getInstance(signAlgorithm);

signature.initVerify(pubKey);

// Update and verify the data
try {
FileInputStream dataFileInputStream = new FileInputStream(fileToVerify);
BufferedInputStream bufferedInputStream = new BufferedInputStream(dataFileInputStream);

byte[] buffer = new byte[IVerifyDigitalSignature.BYTE_SIZE];
int bufferedInputStreamLength;

while (bufferedInputStream.available() != IVerifyDigitalSignature.ZERO_LENGTH) {
bufferedInputStreamLength = bufferedInputStream.read(buffer);
signature.update(buffer, IVerifyDigitalSignature.ZERO_LENGTH, bufferedInputStreamLength);
}

bufferedInputStream.close();

// Verify the Signature
x509Certificate.verify(pubKey);
verifyDigitalSignature = signature.verify(sigToVerify);

请帮我解决该问题,因为它尚未关闭。

最佳答案

如果您想自己执行此操作,是的,您必须迭代链中的证书从信任 anchor 到您所需的证书,无论它有多长(对于不同的 CA、类别和不同的时间,它可能会有所不同)。使用“父”(下一个更高级别)证书中的公钥验证每个“子”(较低级别)证书上的签名只是一个其中相当小的一部分;还需要许多其他步骤。通常,找到正确的证书就可能是一个问题;如果您已经拥有正确的链条,那么您就拥有了领先优势。但你确定你拥有“正确的”链条吗?通常,给定的证书有多个可能的链,有时其中一些是有效的,但另一些已经过期或变得无法验证。Verisign 特别发布了我相信所有最近的证书都在其 G5 根下,但提供了替代路径对于不是最新的,有时甚至无法更新的依赖者,返回(有效)G1。

大多数情况下的算法在“PKIX”RFC5280中定义。 ,除了 OCSP RFC6960代替 CRL 进行撤销正变得越来越普遍。您可能会忽略跨层次结构和名称约束,据我所知实际上并没有使用它们由 Verisign 等公共(public) CA 提供,以及 CA 确实使用但用户/依赖者不关心的策略内容。 https://security.stackexchange.com/questions/37409/certificate-chain-checking有一个很好但不完整的介绍。

但是你可能会更好使用Java的(实际上是JCE的)CertPathValidator for "PKIX" - 如果需要CertPathBuilder -我已经向您介绍过。这已经由专家编写和测试。只是调用它还是有点复杂,但远没有重写它所做的所有事情那么复杂。

关于java - 我的代码可以验证自签名证书,但在使用 VeriSign 颁发的证书时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26607365/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com