Java 使用IText对pdf文件签名时出现0x2726错误

Java 使用IText对pdf文件签名时出现0x2726错误,java,pdf,itext,digital-signature,digital-certificate,Java,Pdf,Itext,Digital Signature,Digital Certificate,我正试图用我自己的提供者用java中的IText以编程方式对pdf文件进行签名。当我用p12文件签名时,一切都很好。但当我尝试用令牌签名时,我没有任何例外。但是,当我尝试打开签名pdf时,会出现以下错误0x2726 这里是我的签名文件: 请帮忙 public static void main(String[] args) throws IOException, GeneralSecurityException, DocumentException { char[] pass = PAS

我正试图用我自己的提供者用java中的IText以编程方式对pdf文件进行签名。当我用p12文件签名时,一切都很好。但当我尝试用令牌签名时,我没有任何例外。但是,当我尝试打开签名pdf时,会出现以下错误0x2726

这里是我的签名文件: 请帮忙

public static void main(String[] args) throws IOException, GeneralSecurityException, DocumentException {

    char[] pass = PASSWORD.toCharArray();
    MyProvider provider = new MyProvider();
    Security.addProvider(provider);
    KeyStore ks = null;
    try {
        ks = KeyStoreUtil.getKeyStore(Storage.MYTOKEN, "TOEKN_PATH", pass, provider);

    } catch (KeyStoreException | NoSuchProviderException | FileNotFoundException | NoSuchAlgorithmException | CertificateException | PrivilegedActionException ex) {
        Logger.getLogger(PDFSIGN.class.getName()).log(Level.SEVERE, null, ex);
    }
    PDFSIGN app = new PDFSIGN();
    PrivateKey pk = null;
    Certificate[] chain = new Certificate[1];
    Enumeration<String> als = ks.aliases();
    String alias = (String) als.nextElement();
    System.err.println(alias);
    Certificate cert = ks.getCertificate(alias);
    ASN1InputStream ais = new ASN1InputStream(cert.getEncoded());
    X509CertificateStructure x509Struct = new X509CertificateStructure((ASN1Sequence) ais.readObject());
    ais.close();
    X509CertificateObject certificateObject = new X509CertificateObject(x509Struct);
    chain[0] = certificateObject;
    passw = "123456";
    pk = (PrivateKey) ks.getKey(alias, passw.toCharArray());
    app.sign(SRC, DEST, chain, pk, DigestAlgorithms.SHA1, provider.getName(), CryptoStandard.CMS, "Test", "Ghent", crlList, null, null, 0);
}

public void sign(String src, String dest, Certificate[] chain, PrivateKey pk, String digestAlgorithm, String provider, CryptoStandard subfilter, String reason, String location, Collection<CrlClient> crlList,
        OcspClient ocspClient, TSAClient tsaClient, int estimatedSize)
        throws GeneralSecurityException, IOException, DocumentException {

    PdfReader reader = new PdfReader(src);
    FileOutputStream os = new FileOutputStream(dest);
    PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0');
    PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
    appearance.setReason(reason);
    appearance.setLocation(location);
    appearance.setVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "sig");
    ExternalSignature pks = new PrivateKeySignature(pk, digestAlgorithm, provider);
    ExternalDigest digest = new ProviderDigest(provider);
    MakeSignature.signDetached(appearance, digest, pks, chain, crlList, ocspClient, tsaClient, estimatedSize, subfilter);

}
publicstaticvoidmain(String[]args)抛出IOException、GeneralSecurityException、DocumentException{
char[]pass=PASSWORD.toCharArray();
MyProvider provider=新的MyProvider();
Security.addProvider(提供者);
密钥库ks=null;
试一试{
ks=KeyStoreUtil.getKeyStore(Storage.MYTOKEN,“TOEKN_PATH”,pass,provider);
}catch(KeyStoreException | NoSuchProviderException | FileNotFoundException | NoSuchAlgorithmException | CertificateException | PrivilegedActionException ex){
Logger.getLogger(PDFSIGN.class.getName()).log(Level.SEVERE,null,ex);
}
PDFSIGN app=新的PDFSIGN();
PrivateKey pk=null;
证书[]链=新证书[1];
枚举als=ks.alias();
字符串别名=(字符串)als.nextElement();
System.err.println(别名);
证书cert=ks.getCertificate(别名);
ASN1InputStream ais=新的ASN1InputStream(cert.getEncoded());
X509CertificateStructure x509Struct=新的X509CertificateStructure((ASN1Sequence)ais.readObject());
ais.close();
X509CertificateObject certificateObject=新的X509CertificateObject(x509Struct);
链[0]=证书对象;
passw=“123456”;
pk=(PrivateKey)ks.getKey(别名,passw.tocharray());
app.sign(SRC、DEST、chain、pk、DigestAlgorithms.SHA1、provider.getName()、CryptoStandard.CMS、“测试”、“根特”、crlList、null、null、0);
}
公共无效符号(字符串src、字符串dest、证书[]链、私钥pk、字符串摘要算法、字符串提供程序、加密标准子筛选器、字符串原因、字符串位置、集合crlList、,
OcspClient OcspClient,TSAClient TSAClient,int estimatedSize)
抛出GeneralSecurityException、IOException、DocumentException{
PdfReader读取器=新PdfReader(src);
FileOutputStream os=新的FileOutputStream(dest);
PdfStamper stamper=PdfStamper.createSignature(读卡器,操作系统,'\0');
PdfSignatureAppearance外观=母版。getSignatureAppearance();
外观。设置原因(原因);
外观。设置位置(位置);
外观:setVisibleSignature(新矩形(36748144780),1,“sig”);
ExternalSignature pks=新的PrivateKeySignature(pk、digestAlgorithm、provider);
ExternalDigest=新提供者摘要(提供者);
签名分离(外观、摘要、pks、链、crlList、ocspClient、tsaClient、estimatedSize、子过滤器);
}

首先,您包含了一个500 KB的CRL。仅此一项就可能超过某些加密库的能力。尽管如此,签名值本身似乎存在问题。但是你能提供一个没有巨大CRL的签名进行分析吗?你好!CRL在这里并不重要。我可以删除crl,但结果是一样的。是的,很可能这并不重要,它只是有助于获得一个方便的对象进行分析。(而且你肯定也不想在现实生活中的文档中嵌入CRL…)