You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 23:54:54