如何获取p7s文件的MIME类型?

4

获取文件的MIME类型的一种可能方法如下:

File myFile = File("myDocument.pdf");
Path path = file.toPath();
String mimeType = Files.probeContentType(path);

它返回 application/pdf。一切都正确。

但这种方式不能用于 *.p7s 文件,它返回的是 null,而不是预期的 application/pkcs7-mime

也许有人知道问题出在哪里,以及可能的解决方案?


您正在使用的 FileTypeDetector 实现无法确定文件的 MIME 类型。我相信默认的 FileTypeDetector 是特定于平台的。当您遇到此问题时,您在哪些操作系统上运行代码? - Robin Green
参见https://dev59.com/gGoy5IYBdhLWcg3wiegp - Robin Green
我正在使用Windows 8.1。在您提供的链接中,我找到了Apache Tika,并且它可以准确地确定mime类型(也包括p7s)。谢谢,Robin! - Martynas
2个回答

5
Java的FileTypeDetector默认不支持检测p7s文件格式。因此,除非一些现有的文件类型检测库支持p7s格式,否则您基本上是自己操作。 p7s扩展名由SMIME标准定义为用于RFC 2315中PKCS-7加密签名的文件扩展名。它的MIME内容类型实际上是application/pkcs7-signature。不知道如何处理这些签名的电子邮件客户端允许用户将它们下载为文件。
使用ASN.1RFC 2315中描述了PKCS-7语法。 PKCS-7签名使用DER进行编码。一旦您理解这一点,实际上很容易验证p7s文件是否真的是pkcs7-signature类型。
为了验证p7s文件是否为pk7s-signature,您可以使用Java的ASN.1解析器(例如apache harmony)来解析该文件。然后,您只需要断言ASN.1序列开头的对象标识符是pkcs7-signedData类型(请参阅RFC 2315第14章中对此对象标识符的定义)。此检测方法不能证明p7s文件实际上是PKCS-7签名,但机会极高。
OpenSSL具有内置的ASN1解析器。您可以使用它手动应用上述描述的检测方法:
$ openssl asn1parse -inform DER -in smime.p7s -dump -i
    0:d=0  hl=4 l= 490 cons: SEQUENCE
    4:d=1  hl=2 l=   9 prim:  OBJECT            :pkcs7-signedData
                                                 ^^^^^^^^^^^^^^^^                                                                                       
                                                that's what I am talking about

希望这有所帮助。祝你好运!

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接