没有JRE但使用OpenSSL签署JAR?

时间:2014-07-08 07:12:28

标签: jar openssl sign manifest.mf

我们的系统有Java和C部分。在C方面,我们使用调用OpenSSL命令的命令行脚本来签署某些数据。现在我们也要签署一些JAR。我们已经建立了PKI(对于这种情况很重要 - 私钥可以访问)“在C端”,我们尽量避免重复/扩展到Java端。

为那些不想拥有JRE(但拥有OpenSSL)的人签署JAR的简单方法是什么?即我想为我的JAR创建正确的MANIFEST.MFKEY.SFKEY.?SA。它们的格式并不复杂,这似乎可以通过一些脚本来实现。有人曾经这样做过吗?

1 个答案:

答案 0 :(得分:2)

回答自己的问题。

MANIFEST.MFKEY.SF的格式为documented by Oracle。令人惊讶的是,"Signature File" section中没有详细说明签名KEY.?SA的确切内容(其中" KEY"是签名密钥的密钥库别名)。

这个KEY.RSA(对于RSA签名)可以由OpenSSL命令行工具创建,其方式与jarsigner创建它完全相同。 RSA签名和SHA256摘要的示例:

$ openssl smime -sign -noattr -in META-INF/TEST1.SF -outform der -out META-INF/TEST1.RSA -inkey privateKey.pem -signer cert.pem -md sha256

类似地,可以使用OpenSSL C API生成签名。 C代码的快照(无错误检查):

  /* PKCS7_PARTIAL flag is needed to be able to change the digest from the default value */
  PKCS7 *signed_data = PKCS7_sign(NULL, NULL, NULL, data,
    PKCS7_NOATTR | PKCS7_DETACHED | PKCS7_PARTIAL
  );

  digest = EVP_get_digestbyname("sha256");

  PKCS7_sign_add_signer(signed_data, signcert, pkey, digest, flags);

  PKCS7_final(signed_data, NULL, 0);

以这种方式创建的签名与jarsigner生成的签名相同。