2014-07-08 33 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。但至少我知道現在從哪裏開始。 :-) –