IText 8.0.3中PAdES签名的IssuerSerial匹配问题
问题:iText 8.0.3 Baseline LTA签名缺少IssuerSerial匹配项
问题详情
使用iText 8.0.3的PdfPadesSigner类的SignWithBaselineLTAProfile方法签署PDF文档,通过PKCS11库将USB令牌中的证书作为ExternalSignature使用,其余流程均正常,但生成的签名结构中缺少IssuerSerial匹配项。
相关代码示例
var padesSigner = new PdfPadesSigner(new PdfReader(content.Document.Stream), signedStream); IList<IX509Certificate> trusted = new List<IX509Certificate>(); foreach (var crnCert in parameters.TrustedCertificates) trusted.Add(new X509CertificateBC(crnCert)); padesSigner.SetTrustedCertificates(trusted); TSAClientBouncyCastle timeStampInfo = null; if (parameters.TimeStampSettings != null) timeStampInfo = new TSAClientBouncyCastle(parameters.TimeStampSettings.HostUrl, parameters.TimeStampSettings.LoginId, parameters.TimeStampSettings.Password); var certificates = new IX509Certificate[] { new X509CertificateBC(parameters.SigningCertificate) }; padesSigner.SignWithBaselineLTAProfile(properties, certificates, this, timeStampInfo);
预期签名结构
<RelatedCertificate Certificate="CERTIFICATE_FATİH-POLAT_20231017-0920"> <Origin>SIGNED_DATA</Origin> <Origin>DSS_DICTIONARY</Origin> <Origin>VRI_DICTIONARY</Origin> <CertificateRef> <Origin>SIGNING_CERTIFICATE</Origin> <IssuerSerial match="true">MIIBAzCB86SB8DCB7TELMAKGI....</IssuerSerial> <DigestAlgoAndValue match="true"> <DigestMethod>SHA256</DigestMethod> <DigestValue>Fuxst8SamhghugBDp/6FD+kzENHiYzqEyKOXaFZL2jc=</DigestValue> </DigestAlgoAndValue> </CertificateRef> </RelatedCertificate>
实际签名结构
<RelatedCertificate Certificate="CERTIFICATE_FATİH-POLAT_20231017-0920"> <Origin>SIGNED_DATA</Origin> <Origin>DSS_DICTIONARY</Origin> <Origin>VRI_DICTIONARY</Origin> <CertificateRef> <Origin>SIGNING_CERTIFICATE</Origin> <DigestAlgoAndValue match="true"> <DigestMethod>SHA256</DigestMethod> <DigestValue>Fuxst8SamhghugBDp/6FD+kzENHiYzqEyKOXaFZL2jc=</DigestValue> </DigestAlgoAndValue> </CertificateRef> </RelatedCertificate>
解决方案
补充完整证书链:确保传入的
certificates数组包含签名证书及上级颁发证书的完整链。iText生成IssuerSerial依赖证书层级关系,仅传入签名证书可能导致无法解析颁发者序列号。修改示例:// 假设parameters中包含完整证书链集合 var certificates = parameters.SigningCertificateChain .Select(cert => new X509CertificateBC(cert)) .ToArray();验证证书元数据可用性:通过BouncyCastle工具类检查USB令牌证书的颁发者DN和序列号是否可正常读取,部分令牌驱动可能未正确暴露这些属性:
var bcCert = new X509CertificateBC(parameters.SigningCertificate); Console.WriteLine($"颁发者DN: {bcCert.GetIssuerDN()}"); Console.WriteLine($"序列号: {bcCert.GetSerialNumber()}");若属性为空,需检查令牌驱动或PKCS11配置,确保证书元数据可正常访问。
显式配置证书引用策略:在调用签名方法前,通过
SignerProperties强制设置包含IssuerSerial:var signerProperties = new SignerProperties() .SetSigningCertificateReferencePolicy(SigningCertificateReferencePolicy.INCLUDE_ISSUER_SERIAL); padesSigner.SignWithBaselineLTAProfile(signerProperties, certificates, this, timeStampInfo);检查版本兼容性:确认iText 8.0.3是否存在Baseline LTA签名的相关bug,可尝试升级至最新稳定版,查看官方修复记录。
内容的提问来源于stack exchange,提问作者Fatih POLAT
相关产品推荐
相关产品推荐

