Skip to content

验证数字签名

验证数字签名包含两个部分:验证签名有效和验证证书可信。

签名有效代表文档未被篡改,证书可信代表签名者是可信任的。一般来说,签名有效且证书可信才代表一个签名验证通过。

验证数字签名的关键代码如下:

java
CPDFDocument document = new CPDFDocument(context);
document.open(FileUtils.getAssetsTempFile(context, "Signed.pdf"));
// 获取文档中所有的数字签名。
for (int i = 0; i < document.getSignatureCount(); i++) {
  CPDFSignature signature = document.getPdfSignature(i);
  //检查签名者数组是否存在且不为空。
  if (signature.getSignerArr() != null && signature.getSignerArr().length > 0) {
    CPDFSigner signer = signature.getSignerArr()[0];

    // 检查签名的有效性。
    boolean verifyValid = signature.verify(document);

    // 检查文档是否被修改。
    boolean unmodified = signature.verifyDocument(document);

    // 确定签名是否有效以及确定文档未被修改。
    boolean isSignVerified = verifyValid && unmodified;

    // 检查证书是否可信。
    boolean certChainTrusted = signer.getCert().verifyGetChain(document.getContext(), signature);
    boolean certificateIsTrusted = signer.getCert().checkCertificateIsTrusted(document.getContext());
    boolean certIsTrusted = certChainTrusted || certificateIsTrusted;

    // 检查证书是否过期。
    boolean isExpired = signer.getCert().isExpired();

    // 根据验证结果采执行相应的操作。
    if (isSignVerified && certIsTrusted) {
      // 签名有效并且证书可信。
      // 执行相应的操作。
    } else if (isSignVerified && !certIsTrusted) {
      // 签名有效但证书不可信。
      // 执行相应的操作。
    } else {
      // 签名无效。
      // 执行相应的操作。
    }
  }
}
kotlin
val document = CPDFDocument(context)
document.open(FileUtils.getAssetsTempFile(context, "Signed.pdf"))
// 获取文档中所有的数字签名。
for (i in 0 until document.signatureCount) {
  val signature = document.getPdfSignature(i)
  // 检查签名者数组是否存在且不为空。
  if (signature.signerArr != null && signature.signerArr.isNotEmpty()) {
    val signer = signature.signerArr[0]

    // 检查签名的有效性。
    val verifyValid = signature.verify(document)

    // 检查文档是否被修改。
    val unmodified = signature.verifyDocument(document)

    // 确定签名是否有效以及确定文档未被修改。
    val isSignVerified = verifyValid && unmodified

    // 检查证书是否可信。
    val certChainTrusted = signer.cert.verifyGetChain(document.context, signature)
    val certificateIsTrusted = signer.cert.checkCertificateIsTrusted(document.context)
    val certIsTrusted = certChainTrusted || certificateIsTrusted

    // 检查证书是否过期。
    val isExpired = signer.cert.isExpired

    // 根据验证结果采执行相应的操作。
    if (isSignVerified && certIsTrusted) {
      // 签名有效并且证书可信。
      // 执行相应的操作。
    } else if (isSignVerified && !certIsTrusted) {
      // 签名有效但证书不可信。
      // 执行相应的操作。
    } else {
      // 签名无效。
      // 执行相应的操作。
    }
  }
}