2014-07-08 21 views
2

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

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

回答

1

回答自己的问题。

格式MANIFEST.MFKEY.SFdocumented by Oracle。令人惊讶的是,签名KEY.?SA(其中“KEY”是签名密钥的密钥库别名)的确切内容在"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将产生。

+0

无论如何,你知道如何计算* .SF文件中的“SHA-256-Digest-Manifest-Main-Attributes”吗?那是什么数据按什么顺序? :-)我需要签署一个jar文件w/o jarsigner,因为我们将使用HSM密钥。 –

+0

@Jan Goyvaerts在Github上查看“python-javatools”的源代码。或者,在这里问一个问题:-) – user3608247

+0

谢谢!我将调试代码并查看它使用的数据。乍一看,它是完整的产品线,但这不适用于bash。但至少我知道现在从哪里开始。 :-) –