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

基于iText 7与GlobalSign文档签名服务(DSS)签署文档

iText 7 与 GlobalSign DSS 集成签名方案说明

首先明确:iText 7完全支持通过GlobalSign文档签名服务(DSS)签署文档,因为GlobalSign DSS遵循通用的PKI签名标准(比如PKCS#12、基于REST的签名调用),而iText 7本身具备完善的数字签名API,可以对接这些标准流程。

核心集成思路

GlobalSign DSS通常提供两种常见的签名方式,对应iText 7的两种集成路径:

  • 基于本地签名证书(PKCS#12):如果DSS为您提供了可本地存储的签名证书(.p12/.pfx格式),可以直接用iText 7的Pkcs12Signature类加载证书,完成文档签名。
  • 基于REST API远程签名:如果DSS要求通过API调用获取签名值(比如云端签名服务),可以先通过iText 7生成待签名的哈希值,调用GlobalSign DSS API获取签名结果后,再用iText 7将签名值嵌入文档。

示例代码参考

1. 本地PKCS#12证书签名(适用于DSS提供本地证书的场景)

import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfSigner;
import com.itextpdf.signatures.BouncyCastleDigest;
import com.itextpdf.signatures.DigestAlgorithms;
import com.itextpdf.signatures.Pkcs12Signature;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.KeyStore;

public class GlobalSignDssLocalSign {
    public static void main(String[] args) throws Exception {
        // 输入文件、输出文件路径
        String src = "input.pdf";
        String dest = "signed_output.pdf";
        
        // 加载GlobalSign DSS提供的PKCS#12证书
        KeyStore ks = KeyStore.getInstance("PKCS12");
        ks.load(new FileInputStream("globalsign_cert.p12"), "your_cert_password".toCharArray());
        String alias = ks.aliases().nextElement();
        
        // 初始化PdfSigner
        PdfSigner signer = new PdfSigner(new PdfReader(src), new FileOutputStream(dest), false);
        // 创建签名外观
        signer.setCertificationLevel(PdfSigner.CERTIFIED_NO_CHANGES_ALLOWED);
        signer.getSignatureAppearance()
                .setReason("Document signed via GlobalSign DSS")
                .setLocation("Your Location")
                .setContact("Your Contact");
        
        // 使用PKCS#12签名对象
        Pkcs12Signature signature = new Pkcs12Signature(ks, alias, "your_cert_password");
        // 设置签名算法和摘要算法
        signer.signDetached(new BouncyCastleDigest(), signature, ks.getCertificateChain(), null, null, null, 0, PdfSigner.CryptoStandard.CMS);
    }
}

2. REST API远程签名(适用于云端DSS服务)

这种场景需要先通过iText生成待签名的哈希,再调用GlobalSign DSS API获取签名值,最后嵌入文档:

import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfSigner;
import com.itextpdf.signatures.BouncyCastleDigest;
import com.itextpdf.signatures.DigestAlgorithms;
import com.itextpdf.signatures.ExternalSignature;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.MessageDigest;
import java.security.cert.Certificate;
import java.util.List;

public class GlobalSignDssRemoteSign {
    // 模拟调用GlobalSign DSS API获取签名值的方法
    private static byte[] callGlobalSignDssApi(byte[] hash, List<Certificate> certChain) throws Exception {
        // 这里替换为实际的GlobalSign DSS API调用逻辑:
        // 1. 将哈希值发送到DSS服务
        // 2. 服务返回签名后的字节数组
        // 示例仅为占位,需根据GlobalSign DSS的API文档实现
        return new byte[0];
    }

    public static void main(String[] args) throws Exception {
        String src = "input.pdf";
        String dest = "remote_signed_output.pdf";
        
        PdfSigner signer = new PdfSigner(new PdfReader(src), new FileOutputStream(dest), false);
        signer.setCertificationLevel(PdfSigner.CERTIFIED_NO_CHANGES_ALLOWED);
        signer.getSignatureAppearance()
                .setReason("Remote signed via GlobalSign DSS")
                .setLocation("Cloud");
        
        // 定义外部签名实现,对接GlobalSign DSS
        ExternalSignature externalSignature = new ExternalSignature() {
            @Override
            public byte[] sign(byte[] message) throws Exception {
                // 生成待签名的哈希(这里用SHA-256,需和DSS服务配置一致)
                MessageDigest digest = MessageDigest.getInstance(DigestAlgorithms.SHA256);
                byte[] hash = digest.digest(message);
                // 调用GlobalSign DSS API获取签名值
                return callGlobalSignDssApi(hash, getGlobalSignCertChain());
            }

            @Override
            public String getHashAlgorithm() {
                return DigestAlgorithms.SHA256;
            }

            @Override
            public String getEncryptionAlgorithm() {
                // 根据GlobalSign DSS使用的算法调整,比如RSA
                return "RSA";
            }
        };
        
        // 获取GlobalSign DSS提供的证书链(需提前从DSS获取)
        List<Certificate> certChain = getGlobalSignCertChain();
        
        // 完成签名
        signer.signDetached(new BouncyCastleDigest(), externalSignature, certChain, null, null, null, 0, PdfSigner.CryptoStandard.CMS);
    }

    // 模拟获取GlobalSign DSS证书链的方法
    private static List<Certificate> getGlobalSignCertChain() throws Exception {
        // 替换为实际从DSS获取证书链的逻辑,比如从文件加载或API获取
        return List.of();
    }
}

注意事项

  • 确保引入iText 7的签名相关依赖(比如itext7-core和itext7-signatures),以及BouncyCastle作为加密提供者。
  • 对接GlobalSign DSS时,需严格遵循其官方文档的API规范和证书使用要求,比如签名算法的一致性、API调用的认证方式(API密钥、OAuth等)。
  • 测试时建议先使用GlobalSign DSS的测试环境(沙箱)验证流程,再切换到生产环境。

内容的提问来源于stack exchange,提问作者Anirudh Karanam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:51:09