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