Skip to content
Demo示例FAQ

PDF 生成模板编辑器

开源可视化 PDF 生成引擎,支持自定义模板,并提供面向开发者的 API,灵活构建文档生成流程。

查看 GitHub

AWS KMS 签名 ​

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 写入代码或日志。

java
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 配置。

java
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 凭证。