我正在尝试从我的 pdf 文档中提取签名时间,我知道它有来自下面的 Acrobat 的时间戳:
但是当我尝试打印经过身份验证的属性时,我找不到它们(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);
但是这是我的“经过身份验证的属性”的控制台信息,没有签名时间 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);
};
我读过很多类似的问题:
并阅读了有关数字签名的文档:
https://www.adobe.com/devnet-docs/acrobatetk/tools/DigSigDC/Acrobat_DigitalSignatures_in_PDF.pdf
https://www.ietf.org/rfc/rfc3161.txt
但是没有效果。
我不使用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 的属性。