我刚收到一封电子邮件,其 X-Mailer 为“X-Mailer:Microsoft CDO for Windows 2000”。它有一个附件 .sgn 文件,其内容是 XML,其中一个字段显然是 base64 编码的 PDF:
<DocumentEnvelope><SignaturePackage><Signature =
xmlns=3D"http://www.w3.org/2000/09/xmldsig#"><SignedInfo><Canonicalizatio=
nMethod Algorithm=3D"http://www.w3.org/TR/2001/REC-xml-c14n-20010315" =
/><SignatureMethod =
Algorithm=3D"http://www.w3.org/2000/09/xmldsig#rsa-sha1" /><Reference =
URI=3D"#SignedDoc"><DigestMethod =
Algorithm=3D"http://www.w3.org/2000/09/xmldsig#sha1" =
/><DigestValue>MFV2XJ9rfjhGCyA948wKB741ChQ=3D</DigestValue></Reference></=
SignedInfo><SignatureValue>aKHfEGfu2p9RdShv1Vv/kqC6gjdymojq0rQA+AU/hPocrr=
VqMQk2wbbJD60jc8QPP0kPIo4vWqB1mVx5Y45HK0LFWxMDkJ2/CN8GcODEum2Mamn3W2j9tKV=
8JfJAexlW47LprDq99W9YwfpXusaEplCOErCRj/2dhnGc4SgZXxw=3D</SignatureValue><=
KeyInfo><KeyValue><RSAKeyValue><Modulus>nz78eiuYN1Jmm5ND8xLLbJ9QTrBpjTMfv=
h4mbmHbBSB7HSHU+7Izp5GCiyDAlmXa3JjqKBRjw2+OpwhsJf+KHPltKFKwOltTN9QJWS4HJm=
H1xqF4VAuwvpp1tlJd1KP5WL/j9YCYigzEfZIAAUC2KiFlAxoR1mwz3alMR4v96h8=3D</Mod=
ulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue></KeyInfo><Object =
Id=3D"SignedDoc"><DocumentOriginName =
xmlns=3D"">ecd20f25-95b3-4dc3-b8e6-fc62d23db259</DocumentOriginName><Docu=
mentExtension xmlns=3D"">pdf</DocumentExtension><DocumentCreationDate =
xmlns=3D"">2014-02-27T22:10:27.4320656+02:00</DocumentCreationDate><Docum=
entContent =
xmlns=3D"">JVBERi0xLjQNJeLjz9MNCjMgMCBvYmoNPDwvQ291bnQgMS9LaWRzWzQgMCBSXS=
9QYXJlbnQgMiAwIFIgDS9UeXBlL1BhZ2VzPj4NZW5kb2JqDTQgMCBvYmoNPDwvQXJ0Qm94WzA=
(...等等等等...)
P9fdsc3jL4yg7at7G488BKcqQbpnZDkhXFsfhc/VIuPexfElgnf2oagaf/QjiZHy+ganiZcAH=
dFFFrN6xYK5n0JL5g330NKzD5CHBS8X1civ8VUAKdWjgI8pm1rFsm4v20SwIp/81OH1w=3D=3D=
</CertBase64></Certificate></SignaturePackage></DocumentEnvelope>
如果我只复制 DocumentContent 部分,然后对其进行 base64 解码,我会看到 PDF 1.3 标头,但有些解码器会卡住,而且无论如何,我无法从该部分获得可用的 PDF。因此:
- 我如何从那里手动提取 PDF 文件?
- 是否有一个独立的工具可以从此类邮件或 .sgn 文件中提取文件?
- 是否有 Thunderbird 扩展可以处理这些问题并将 PDF 作为常规附件呈现?
笔记:
- 该文件是由以色列法院的“Net Ha-Mishpat”平台自动发送的。我可以联系法院,但他们没有技术人员,我也无法联系他们使用的软件承包商。
- 我知道过去有人设法从这些 .sgn 中提取解码文件,我只是不知道具体怎么做的。
答案1
我今天亲自拿到了其中一份文件。
由于向技术支持人员解释问题所在似乎比自己尝试提取问题要花费更多时间,因此我创建了一个小型 Python 脚本来提取和解码pdf嵌入在签名文件。
也就是说,假设有一个附加的pdf文件和签名文件格式和我的一样。
我希望有人会发现它有用。
import base64
import xml.etree.ElementTree as ET
import sys
def decode(infile, outfile):
tree = ET.parse(infile)
xmlns = '{http://www.w3.org/2000/09/xmldsig#}'
b64 = tree.find("./SignaturePackage/{0}Signature/{0}Object/DocumentContent".format(xmlns)).text
txt = base64.b64decode(b64)
with open(outfile, 'bw+') as f:
f.write(txt)
if __name__ == "__main__":
if len(sys.argv) < 2:
print('usage: python unpack.py <input_filename>')
exit(1)
infile = sys.argv[1]
outfile = 'out.pdf'
decode(infile, outfile)
print('Done. Result saved to {0}'.format(outfile))
我创建了一个要旨对于这个脚本。
你需要Python 3.x安装,把签名文件和 python 脚本放在同一个文件夹中(或提供脚本的文件路径)并像这样执行它:
python unpack.py <sig_filename>
这将创建一个名为出处.pdf在同一个文件夹中。
答案2
这是一个基本的脚本,您可以在类 Unix 系统上使用(可能在 Windows 上也行,但需要稍加修改),从文档信封中提取 PDF 文件;我称之为sgn2pdf
(因为 doc 信封文件具有 sgn 扩展名)。它的命令行界面是
sgn2pdf [INPUT_FILENAME] [OUTPUT_FILENAME]
即,如果您添加第一个参数,它将从该文件而不是从标准输入读取;并且如果您添加第二个参数,它将把输出重定向到指定的第二个文件。
来源:
#!/bin/bash
#
# Extract a PDF file from an Israeli courts' .sgn PDF document envelope
exec 3<&0 # tie (new) file descriptor 3 to what is currently the standard input
exec 4>&1 # tie (new) file descriptor 4 to what is currently the standard output
if [[ $# > 0 ]]; then
exec 3<$1
shift
fi
if [[ $# > 0 ]]; then
exec 4>$1
shift
fi
exec <&3 >&4
sed -r 's/^.*<DocumentContent[^>]*>//; s/<\/Document.*$//;' | base64 -d -i >&4
解码base64
器是 GNUcoreutils
软件包的一部分,可在任何 Linux 发行版上使用。
答案3
CDO 200 和文档信封的使用表明该电子邮件可能是自动或以编程方式发送的,即通过脚本、Access 或以其他方式通过 SMTP 和 CDO 兼容程序(而不是普通邮件客户端)发送。
SGN 文件不太可能是真正的 SGN 文件,后者是“Sierra Print Artist”文件;更有可能的是,有人手动将扩展名用于签名文件。
我不认为这个文件是那种你希望打开的附件。你看到的文件更有可能包含在电子邮件中,以便发件人在自动生成时将其显示为“已签名”。由于 PDF 嵌入在 XML 文件中,因此可能没有扩展程序可以自动解码附件中你认为是 PDF 的部分。你可以尝试复制整个部分,然后对其进行解码,并使用兼容 unicode 的文本编辑器保存解码后的文本,然后查看是否可以将其打开为可读的 PDF。
但我认为你在浪费时间,这个附件类似于有人通过 CDO 从某个程序向你发送电子邮件时附带了包含图像的 vCard 时你会看到的内容。也就是说,它无法解码,因为如果你能解码,那么你也许可以伪造发件人的签名。
您是否尝试联系发件人以了解附件是否有任何意义?在我看来,这显然只是一份合格的签名文件。标头告诉您,用于生成签名的算法是 http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd#rsa-sha1——仅凭这一点就应该告诉你,这不是一个你应该打开的文件。