我们的系统有 Java 和 C 部分。在 C 端,我们使用调用 OpenSSL 命令的命令行脚本对某些数据进行签名。现在我们也想签署一些 JAR。我们已经“在 C 端”建立了 PKI(对于这种情况很重要 - 私钥是可访问的),我们尽量避免将其复制/扩展到 Java 端。
为不想拥有 JRE(但拥有 OpenSSL)的人签名 JAR 的简单方法是什么? IE。我想为我的 JAR 创建正确的 MANIFEST.MF
、KEY.SF
和 KEY.?SA
。它们的格式并不复杂,这似乎可以通过一些脚本来实现。以前有人这样做过吗?
最佳答案
回答自己的问题。
MANIFEST.MF
和KEY.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/