PDF 生成模板编辑器
开源可视化 PDF 生成引擎,支持自定义模板,并提供面向开发者的 API,灵活构建文档生成流程。
SDK 使用前提及通用导入请参见数字签名概览。
CPDFAwsKmsSigner 使用 AWS KMS 密钥签署已保存的 PDF,私钥保留在 KMS。调用方提供 KMS 配置,以及公钥与该密钥匹配的签名证书。
当前直连入口支持至少 2048 位的 RSA KMS 密钥和 RSASSA_PKCS1_V1_5_SHA_256,其他算法会被拒绝。endpoint 必须为根 HTTPS URL,不能包含显式端口、额外路径、查询或片段。
该入口要求显式 access-key 凭证,不自动使用 AWS 默认凭证提供链。非空 Session Token 的临时凭证当前返回 sdk.kms.session_token_unsupported。
从应用配置读取凭证,不将真实 Secret Access Key 写入代码或日志。
Files.createDirectories(Paths.get("output"));
CPDFAwsKmsConfig kms = new CPDFAwsKmsConfig()
.setEndpoint("https://kms.us-east-1.amazonaws.com")
.setRegion("us-east-1")
.setKeyId("YOUR_KMS_KEY_ID_OR_ARN")
.setCredentials(
System.getenv("AWS_ACCESS_KEY_ID"),
System.getenv("AWS_SECRET_ACCESS_KEY"),
"")
.setSigningAlgorithm("RSASSA_PKCS1_V1_5_SHA_256")
.setCertificate(
Files.readAllBytes(Paths.get("certs/kms-signer.der")),
new byte[][] {Files.readAllBytes(Paths.get("certs/kms-issuer.der"))});
CPDFSignatureOptions options = new CPDFSignatureOptions()
.setFieldName("KmsSignature")
.setVisible(false)
.setValidationOptions(new CPDFSignatureValidationOptions()
.setTrustedCertPath("certs/trusted-roots.pem"));
CPDFSignatureCreateResult result = CPDFAwsKmsSigner.sign(
"input.pdf", "output/kms-signed.pdf", options, kms);
System.out.println("Creation success: " + result.isSuccess());
System.out.println(Arrays.toString(result.getErrors()));
System.out.println(result.getValidationResult());签名者和证书链使用 DER 编码。输出路径必须不存在、与输入不同且父目录已存在。创建成功与验签、信任结论分别报告。
获取公钥和生成 CSR
getPublicKey() 返回 DER 编码的 X.509 SubjectPublicKeyInfo;generateCsr() 返回通过 KMS 签署的 DER PKCS#10 请求,可提交给 CA 申请证书。这两个接口不导出私钥,也不签发 CA 证书。下面复用前例的 kms 配置。
CPDFKmsDataResult publicKey = CPDFAwsKmsSigner.getPublicKey(kms);
if (publicKey.isSuccess()) {
Files.write(Paths.get("output/kms-public-key.der"), publicKey.getData());
}
kms.setCommonName("Example PDF Signing Key");
CPDFKmsDataResult csr = CPDFAwsKmsSigner.generateCsr(kms);
if (csr.isSuccess()) {
Files.write(Paths.get("output/kms-signer.csr.der"), csr.getData());
}当前 CPDFAwsKmsSigner.sign() 创建普通 detached PKCS#7 签名,不生成 PAdES 属性、内嵌签名时间戳或 LTV 证据。signPades() 返回 sdk.kms.pades_unsupported,不请求 KMS,也不创建 PDF。
追加文档时间戳或调用 LTV 延长本身不能保证普通 KMS 签名满足 LT/LTA,应检查级别报告。如果外部服务自行管理 KMS 并返回完整 CMS,可使用外部容器或二阶段接口,Java 调用方无需持有该服务内部的 KMS 凭证。