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

Mar*_*nas 4 java file mime-types

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

File myFile = File("myDocument.pdf");
Path path = file.toPath();
String mimeType = Files.probeContentType(path);
Run Code Online (Sandbox Code Playgroud)

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

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

Lod*_*rds 5

Java 的 FileTypeDetector 不支持开箱即用的 p7s 文件格式检测。因此,除非某些文件类型检测库确实支持 p7s 格式,否则您几乎只能靠自己了。

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

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

为了验证 p7s 文件是否是 pk7s 签名,您可以使用适用于 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
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。祝你好运!