基于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
相关产品推荐
相关产品推荐

