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

时间:2014-01-11 00:11:02

标签: java file mime-types

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

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

返回application/pdf。一切都是正确的。 但这种方式不适用于*.p7s个文件。它返回null而不是预期的application/pkcs7-mime

也许有人知道问题出在哪里以及解决方案是什么?

2 个答案:

答案 0 :(得分:1)

Java的FileTypeDetector不支持开箱即用的p7s文件格式检测。因此,除非某些文件类型检测库确实支持p7s格式,否则您几乎可以独立完成。

p7s扩展名由SMIME标准定义为RFC 2315中用于PKCS-7加密签名的文件扩展名。它的mime内容类型实际上是application/pkcs7-signature。不知道如何处理这些签名的电子邮件客户端允许用户将它们作为文件下载。

使用ASN.1中的RFC 2315描述PKCS-7语法。 PKCS-7签名使用DER进行编码。一旦理解了这一点,实际上并不难以验证p7s文件是否实际上是pkcs7-signature类型。

为了验证p7s文件是否为pk​​7s-signature,您可以使用像apache harmony这样的Java ASN.1解析器来解析文件。然后,您只需断言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 :(得分:0)

我发现最好的方法是使用Apache Tika

有关详细信息,请参阅How to accurately determine mime data from a file?

谢谢罗宾!

相关问题