jdk工具keytool和jarsigner協助Part2(jdk keytool&jarsigner tool manual)
0.背景
keytool是JDK中包含的密鑰和認證的管理工具。用於管理私密金鑰及其相關的X.509憑證鏈結的keystore。X.509憑證鏈結用於認證對應的公開金鑰,keystore類似於一個資料庫。同時keytool還用於管理信任實體發布的認證。
jarsigner是JDK中包含的用於JAR檔案簽名和驗證的工具。為Java檔案檔案(JAR)產生簽名,以及對已簽名的jar檔案的進行校正。
1.工具Location
這兩個工具都位於$JAVA_HOME/bin目錄下,其中$JAVA_HOME是JDK的安裝目錄。
這兩個工具都是在命令列中使用,在命令列視窗輸入:
keytool和jarsigner即可擷取命令的工具的使用方法。
2.jarsigner工具簡介
jarsigner工具主要有以下兩個作用:
a.對JAR檔案簽名
b.校正簽名以及簽名JAR檔案的完整性
JAR檔案可以同時包含多個package的類檔案,圖片,聲音以及數字資料,一邊更快更方便的發布。jar工具用來建立JAR檔案,從技術角度來說,任何zip檔案都可以被看作是JAR檔案,雖然使用jar建立的JAR檔案包含META-INF/MANIFEST.MF檔案。
數位簽章是使用一些資料(被簽名的資料)和實體的private key計算出來的位串(bit string),和手寫簽名一樣,數位簽章有很多特徵:
權威性可以被校正,通過使用與private key對應的public key來計算。
不可偽造,假設private key不被泄露。
簽名是資料的一個功能,因此不能同時作為其他資料的簽名。
用於簽名的資料不可更改,否則簽名無法被校正。
為了使實體的簽名作為檔案被產生,實體首先必須有一對密鑰,即public & private key,以及一些認證public key的認證。
認證就是由一個實體對另一個實體的簽名,證明另一個實體的公開金鑰具有某些特定的值。
jarsigner使用keystore中的key和certificate的資訊來為JAR檔案產生一個數位簽章。keystore是用來儲存private keys和它們對應的用於認證公開金鑰的X.509憑證鏈結的資料庫。keytool工具用於建立和管理keystore。
jarsigner使用實體的private key來產生簽名。被簽名的JAR檔案包含了keystore中private key對應的public key的認證拷貝。jarsigner可以使用其包含的認證來校正JAR檔案的數位簽章。
從J2SE 5.0開始,jarsigner可以產生包含時間戳記的簽名,因此系統/部署可以檢查被簽名的JAR中包含的認證是否有效。J2SE 5.0中也包含了擷取該時間戳記資訊的APIs。
到目前為止,jarsigner只可以對SDK的jar工具產生的JAR檔案以及zip檔案進行簽名。當使用jarsigner對zip檔案進行簽名時,會自動產生META-INF/MANIFEST.MF檔案。
jarsigner的預設功能是對JAR/zip檔案進行簽名,可以使用-verify選項來校正簽名。
3.概念介紹
keystore別名:所有的keystore實體是通過唯一的別名來訪問的。當使用jarsigner來對JAR檔案簽名時,必須指定用來簽名的private key所對應的別名。
keystore儲存位置:jarsigner包含了-keystore選項來指定keystore的URL。
keystore實現:請參考本文的第一部分。
支援的簽名演算法:目前為止,jarsigner可以使用SHA1withDSA或者MD5withRSA兩種散列演算法來對JAR檔案進行起那名。
簽名JAR檔案:當使用jarsigner來對JAR檔案簽名時,輸出的已經被簽名的JAR檔案和輸入的JAR檔案除了以下兩點之外完全相同:
簽名檔案,尾碼名為.SF
簽名塊檔案,尾碼名為.DSA
這兩個檔案的基本檔案名稱(不包含尾碼名)是通過-sigFile選項指定的。如果沒有指定該選項,那麼基本檔案名稱會選取alias的前8個字元,並轉換為大寫字元。如果少於8個字元,則使用全部的alias名字。如果alias中包含了不能作為簽名檔案名稱的字元,那麼轉換為底線。
簽名檔案(.SF):簽名檔案和manifest檔案類似,當使用jarsigner對檔案進行簽名後,總是包含在JAR檔案中。也就是說,對JAR檔案中的每個source檔案,.SF檔案都有三行,和manifest一樣,列舉了以下的內容:檔案名稱、使用的散列演算法SHA、SHA的值。在manifest檔案中,麼個source檔案的SHA散列值是source檔案中位元據的散列值。在.SF檔案中,每個source檔案的散列值是manifest檔案中這三行的散列值。簽名檔案同時在檔案頭包含了整個manifest檔案的散列值,用於最佳化校正。
簽名塊檔案(.DSA):.SF檔案被簽名,並將簽名放在.DSA檔案中,同時.DSA檔案還包含認證或者憑證鏈結。
簽章時間戳:在J2SE5.0版本中,jarsigner工具在簽名時可以產生並儲存簽章時間戳。並且jarsigner支援不同的簽名機制,該功能是可選的,並且可以通過以下選項在簽名時進行控制:
-tsa url
-tsacert alias
-altsigner class
-altsignerpath classpathlist
JAR檔案校正:當簽名合法並且JAR檔案中的任何檔案都沒有被修改時,JAR校正成功。JAR檔案校正包括以下步驟:
校正.SF檔案本身的簽名。
校正.SF檔案中包含的每個實體的散列。
讀取JAR檔案中.SF檔案中包含的每個檔案。讀取的過程中,計算檔案的散列,並將計算結果與manifest檔案中對應的值進行比較。
上述步驟中任何一步失敗,整個校正過程停止,並拋出安全相關的異常,由jarsigner捕獲並顯示。
多簽名JAR檔案:JAR檔案可以被多個使用者進行簽名。
4.jarsigner工具協助
C:/j2sdk1.4.2_15/jre/lib/security>c:/j2sdk1.4.2_15/bin/jarsigner.exe
Usage: jarsigner [options] jar-file alias
jarsigner -verify [options] jar-file
[-keystore <url>]
[-storepass <password>]
[-storetype <type>]
[-keypass <password>]
[-sigfile <file>]
[-signedjar <file>]
[-verify]
[-verbose]
[-certs]
[-internalsf]
[-sectionsonly]
[-provider]
...
舉例說明如下:
C:/>jar cf pg.jar org/*.*
C:/>jarsigner -storetype jks -keystore c:/mykeystore.keystore -digestalg MD5
-sigalg MD5withRSA -signedjar pgsigned.jar pg.jar myalias
キーストアのパスワードを入力してください:
MANIFEST.MF內容如下:
Manifest-Version: 1.0
Created-By: 1.6.0_12 (Sun Microsystems Inc.)
Name: org/jff/example/util/PrintGreeting.class
MD5-Digest: fJspbDcp8N2+CQko6Ciiig==
MYALIAS.SF檔案內容如下:
Signature-Version: 1.0
MD5-Digest-Manifest: v6+Q+Hvz6nmkmwlskcIorg==
MD5-Digest-Manifest-Main-Attributes: qGefyOwqCj8su+kQaMjbBA==
Created-By: 1.6.0_12 (Sun Microsystems Inc.)
Name: org/jff/example/util/PrintGreeting.class
MD5-Digest: WiikmBlOsrbL53bcUpA74g==
MYALIAS.RSA的內容為二進位內容。
C:/>jarsigner -verify pgsigned.jar
jar が検証されました。
修改MYALIAS.SF檔案的內容,然後再校正:
C:/>jarsigner -verify pgsigned.jar
jarsigner: java.lang.SecurityException: cannot verify signature block file META-
INF/MYALIAS
5總結
本文是介紹Java安全工具keytool&jarsigner文章的第二部分,主要介紹了jarsigner的功能及相關概念,並對jdk包含的jarsigner工具進行了簡單的說明。
關於keytool的介紹,請參考本文的第一部分。