我想在IntelliJ IDE中编译this程序。但它返回以下三个错误:
1.对于这一行:
CertStore certs = s.getCertificatesAndCRLs("Collection", "BC");
此错误:
error: cannot find symbol method getCertificatesAndCRLs(String,String)
2.对于这一行:
Collection certCollection = certs.getCertificates(signer.getSID());
此错误:
error: method getCertificates in class CertStore cannot be applied to given types;
required: CertSelector
found: SignerId
reason: actual argument SignerId cannot be converted to CertSelector by method invocation conversion
3.对于此行:
if (signer.verify(cert.getPublicKey(), "BC")) verified++;
此错误:
error: method verify in class SignerInformation cannot be applied to given types;
required: SignerInformationVerifier
found: PublicKey,String
reason: actual and formal argument lists differ in length
这些是我的导入程序的首要任务:
import java.io.*;
import java.util.*;
import java.security.*;
import java.security.Security;
import java.security.cert.*;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.cms.*;
我将jdk1.7.0_15
个库+ bcpkix-jdk15on-151.jar
和bcprov-jdk16-1.45.jar
添加到我的项目中。
有人可以帮我解决这个问题吗?
答案 0 :(得分:0)
请按照以下步骤操作。希望它能帮到你,因为它经过测试。
步骤01:
从文件读取字节数组或将数据对象转换为字节数组。
示例代码:
FileInputStream fis = new FileInputStream(file);
byte fileContent[] = new byte[(int)file.length()];
fis.read(fileContent);
第2步:
从字节数组创建CMSSignedData对象。
示例代码:
CMSSignedData data = new CMSSignedData(fileContent);
步骤03:
从CMSSignedData获取CertStore。
示例代码:
CertStore certs = data.getCertificatesAndCRLs("Collection", "BC");
请务必先在安全性中添加BouncyCastleProvider:
Security.addProvider(new BouncyCastleProvider());'
步骤04:
使用签名者信息获取证书集合。
示例代码:
SignerInformation signer = (SignerInformation) i.next();
Collection<? extends Certificate> certCollection = certs.getCertificates(signer.getSID());
步骤05:
验证签名者对每个证书的签名。
示例代码:
if (signer.verify(new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(cert)) )
{
}
请检查一下,为了完成您的目标,您已经完成了上述步骤。
我猜,要么是从错误的数据输入中创建CMSSignedData,要么依赖库是相互冲突的(最可能的原因)。我使用 bcprov-jdk16-1.46.jar 和 bcmail-jdk16-1.46.jar 来完成所有任务。