jar - 在没有 JRE 但使用 OpenSSL 的情况下签署 JAR?

标签 jar openssl sign manifest.mf

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

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

最佳答案

回答自己的问题。

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

这个 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 生成的签名相同。

关于jar - 在没有 JRE 但使用 OpenSSL 的情况下签署 JAR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24625759/

相关文章:

java - jSTL-api 和 jSTL-impl 的区别

maven-2 - 如果从未使用 pom 构建过,如何添加编译 Maven 项目所需的 jar?

php - 调用未定义的函数 Illuminate\Encryption\openssl_cipher_iv_length() - laraval5

java - iText Java 签名 PDF DocumentException : Not enough space

安卓签名apk文件

php - 使用 PHP 使用 XADES-EPES 对 xml 进行签名

java - 查找 Maven 插件中主要 Artifact 的路径

java - 从代码更新 .JAR 的内容

python-2.7 - 我想在 urllib2 中选择传输层安全协议(protocol)

openssl - 非阻塞套接字在 OpenSSL 中仍然可以阻塞吗?