【问题标题】:How to get mime-type of p7s files?如何获取 p7s 文件的 mime 类型?
【发布时间】:2014-01-30 03:53:11
【问题描述】:

获取文件的 mime-type 的一种可能方法如下:

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

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

也许有人知道问题出在哪里,有什么解决办法?

【问题讨论】:

  • 您正在使用的FileTypeDetector 实现无法确定文件的 MIME 类型。我相信默认的FileTypeDetector 是特定于平台的。遇到此问题时,您在哪个操作系统上运行代码?
  • 我使用的是 Windows 8.1。在您的链接中,我找到了 Apache Tika,它准确地确定了 mime 类型(也是 p7s)。谢谢你,罗宾!

标签: java file mime-types


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    更多详情见How to accurately determine mime data from a file?

    谢谢罗宾!

    【讨论】:

      猜你喜欢
      • 2015-09-13
      • 2018-12-01
      • 2014-09-28
      • 2011-04-20
      • 2014-05-19
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 2011-05-27
      相关资源
      最近更新 更多