使用Javascript从数字签名的PDF中提取RFC 3161时间戳

问题描述 投票:0回答:1

我正在尝试从我的 pdf 文档中提取签名时间,我知道它有来自下面的 Acrobat 的时间戳:

Adobe Acrobat Info regarding timestamp

但是当我尝试打印经过身份验证的属性时,我找不到它们(signingTime 的 OID 是 1.2.840.113549.1.9.5)

这是我查找签名时间属性的代码:

// Extract all authenticated attributes
  const authenticatedAttributes = attrs.map(attribute => {
    const oid = forge.asn1.derToOid(attribute.value[0].value);
    const attributeName = forge.pki.oids[oid] || oid; // Try to resolve OID to a human-readable name // Extract the value, which might be a date, a string, or another encoded type
    let value;
    try {
      value = forge.util.bytesToUtf8(attribute.value[1].value[0].value);
    } catch (e) {
      value = forge.util.bytesToHex(attribute.value[1].value[0].value);
    }
    return {
      oid,
      name: attributeName,
      value,
    };
  });
  console.log("Authenticated Attributes:", authenticatedAttributes);

Autenticated Attributes Console Log

但是这是我的“经过身份验证的属性”的控制台信息,没有签名时间 OID,即使我从上面的 Acrobat 签名详细信息中知道它存在。

有人可以帮忙吗?

我提取数据的步骤如下:

const verify = (signature, signedData, signatureMeta) => {
  const message = getMessageFromSignature(signature);
  const {
    certificates,
    rawCapture: {
      signature: sig,
      authenticatedAttributes: attrs,
      digestAlgorithm,
    },
  } = message;
  // console.log(attrs);
  // Extract all authenticated attributes
  const authenticatedAttributes = attrs.map(attribute => {
    const oid = forge.asn1.derToOid(attribute.value[0].value);
    const attributeName = forge.pki.oids[oid] || oid; // Try to resolve OID to a human-readable name
    // Extract the value, which might be a date, a string, or another encoded type
    let value;
    try {
      value = forge.util.bytesToUtf8(attribute.value[1].value[0].value);
    } catch (e) {
      value = forge.util.bytesToHex(attribute.value[1].value[0].value);
    }
    return {
      oid,
      name: attributeName,
      value,
    };
  });
  console.log("Authenticated Attributes:", authenticatedAttributes);
};

我读过很多类似的问题:

签名包含嵌入的时间戳,但无法验证

如何从数字PKCS7签名中解码时间戳?

验证 RFC 3161 可信时间戳

并阅读了有关数字签名的文档:

https://www.adobe.com/devnet-docs/acrobatetk/tools/DigSigDC/Acrobat_DigitalSignatures_in_PDF.pdf

https://www.ietf.org/rfc/rfc3161.txt

但是没有效果。

javascript pdf cryptography certificate digital-signature
1个回答
0
投票

我不使用JavaScript,所以我只能指出你当前方法中的问题,但不能展示如何在JavaScript中实现它。

您的方法有两个主要问题,通过阅读 RFC 3161 附录 A 就可以清楚地了解这两个问题。

属性集错误

您经常提到您会查看经过身份验证的属性(又名签名属性)。这是在其中查找时间戳的错误属性集,如 RFC 3161 附录 A 中所述:

存储时间戳的一个合理位置是在 [CMS] 结构中作为 无符号属性。

(想一想,很明显签名时间戳不能位于原始签名签名的属性中。)

因此,切换到搜索正确的属性集。

错误的属性标识符

您提到您正在寻找带有 OID 的签名时间 (1.2.840.113549.1.9.5) 的属性。但在搜索签名时间戳时,这是错误的属性,如 RFC 3161 附录 A 中所述:

以下对象标识符标识签名时间戳 属性:

id-aa-timeStampToken OBJECT IDENTIFIER ::= { iso(1) member-body(2)
us(840) rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) aa(2) 14 }

(您寻找的签名时间属性是您可以放置“声明的签名时间”的位置,并且该属性确实是一个签名属性。) 因此,切换到搜索标识符 OID 为 1.2.840.113549.1.9.16.2.14 的属性。

© www.soinside.com 2019 - 2024. All rights reserved.