gpt4 book ai didi

java - CAdES 数字签名

转载 作者:太空宇宙 更新时间:2023-11-04 06:25:04 25 4
gpt4 key购买 nike

我一直在尝试使用葡萄牙公民卡对 PDF 文件实现数字签名 (CAdES),但是我很难找到完美的解决方案。目前我有两套代码。

第一个:

public void signCAdES(...)
{
String pkcs11Config = "name=GemPC" + "\n" + "library=C:\\WINDOWS\\SysWOW64\\pteidpkcs11.dll";
ByteArrayInputStream configStream = new ByteArrayInputStream(pkcs11Config.getBytes());
Provider pkcs11Provider = new sun.security.pkcs11.SunPKCS11(configStream);

//provider_name: SunPKCS11-GemPC
Security.addProvider(pkcs11Provider);

javax.security.auth.callback.CallbackHandler cmdLineHdlr = new DialogCallbackHandler();

KeyStore.Builder builder = KeyStore.Builder.newInstance("PKCS11", pkcs11Provider,
new KeyStore.CallbackHandlerProtection(cmdLineHdlr));
KeyStore ks= builder.getKeyStore();

PdfReader reader = new PdfReader(src);
FileOutputStream os = new FileOutputStream(dest);

PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0', new File(tempPath), true);
PdfSignatureAppearance appearance = stamper.getSignatureAppearance();

appearance.setReason(reason);
appearance.setLocation(location);
appearance.setCertificationLevel(level);

String alias = "CITIZEN SIGNATURE CERTIFICATE";

//certificates from electronic card and resources folder
Certificate[] certs = getSignatureCertificatesChain(ks);

PrivateKey pk = (PrivateKey) ks.getKey(alias, null);

ExternalSignature es = new PrivateKeySignature(pk, "SHA-1", pkcs11Provider.getName());
ExternalDigest digest = new BouncyCastleDigest();

MakeSignature.signDetached(appearance, digest, es, certs, null, null, null, 0, MakeSignature.CryptoStandard.CADES);
}

第一个有效,但是我有一个 validator 来验证 PDF 的签名是否满足标准,并且似乎缺少一个属性(签名证书颁发者的序列号)。

第二个不同,我必须手动添加属性,但是生成的 PDF 已损坏(然后我可能还需要添加发行者序列属性):

private static void signCAdES(byte[] aDocument, PrivateKey aPrivateKey, Certificate[] certChain, String outputPath) {
try {

Security.addProvider(new BouncyCastleProvider());
ArrayList<X509Certificate> certsin = new ArrayList<X509Certificate>();
for (Certificate certChain1 : certChain) {
certsin.add((X509Certificate) certChain1);
}

X509Certificate signingCertificate= certsin.get(0);

MessageDigest dig = MessageDigest.getInstance("SHA-1");
byte[] certHash = dig.digest(signingCertificate.getEncoded());

ESSCertID essCertid = new ESSCertID(certHash);
DERSet set = new DERSet(new SigningCertificate(essCertid));

Attribute certHAttribute = new Attribute(PKCSObjectIdentifiers.id_aa_signingCertificate, set);
AttributeTable at = getAttributeTableWithSigningCertificateAttribute(certHAttribute);
CMSAttributeTableGenerator attrGen = new DefaultSignedAttributeTableGenerator(at);

SignerInfoGeneratorBuilder genBuild = new SignerInfoGeneratorBuilder(new BcDigestCalculatorProvider());
genBuild.setSignedAttributeGenerator(attrGen);

CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
ContentSigner shaSigner = new JcaContentSignerBuilder("SHA1withRSA").build(aPrivateKey);
SignerInfoGenerator sifGen = genBuild.build(shaSigner, new X509CertificateHolder(signingCertificate.getEncoded()));
gen.addSignerInfoGenerator(sifGen);
JcaCertStore jcaCertStore = new JcaCertStore(certsin);
gen.addCertificates(jcaCertStore);

CMSTypedData msg = new CMSProcessableByteArray(aDocument);
CMSSignedData sigData = gen.generate(msg, false); // false=detached

byte[] encoded = sigData.getEncoded();

ASN1InputStream in = new ASN1InputStream(encoded);
CMSSignedData sigData2 = new CMSSignedData(new CMSProcessableByteArray(aDocument), in);
byte[] encoded2 = sigData2.getEncoded();

FileOutputStream fos = new FileOutputStream(outputPath);
fos.write(encoded2);
// fos.write(encoded);
fos.flush();
fos.close();
} catch (CMSException | IOException | OperatorCreationException | CertificateEncodingException ex) {
log("signCAdES", "Error: " + ex.toString());
}
}

有人了解使用Java的CAdES数字签名吗?任何帮助将不胜感激!

最佳答案

“发行者序列号”属性不存在或不匹配!

这意味着您的cades签名没有签名属性:对签名证书的签名引用或该引用被篡改。

请查看:ETSI TS 101 733 V2.2.1 (2013-04) 了解更多信息:

5.7.3 签名证书引用属性

使用以下任一方式支持签名证书引用属性ESS 签名证书属性或 ESS-signing-certificate-v2 属性...

关于java - CAdES 数字签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26893902/

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