Jar 文件数字签名

JAR 文件中的安全性

JAR 文件可以用 jarsigner 工具或者直接通过 java.security API 签名。一个签名的 JAR 文件与原来的 JAR 文件完全相同,只是更新了它的 manifest,并在 META-INF 目录中增加了两个文件,一个签名文件和一个签名块文件。

JAR 文件是用一个存储在 Keystore 数据库中的证书签名的。存储在 keystore 中的证书有密码保护,必须向 jarsigner 工具提供这个密码才能对 JAR 文件签名。


图 1. Keystore 数据库 
 

JAR 的每一位签名者都由在 JAR 文件的 META-INF 目录中的一个具有 .SF 扩展名的签名文件表示。这个文件的格式类似于 manifest 文件 -- 一组 RFC-822 头。如下所示,它的组成包括一个主要部分,它包括了由签名者提供的信息、但是不特别针对任何特定的 JAR 文件项,还有一系列的单独的项,这些项也必须包含在 menifest 文件中。在验证一个签名的 JAR 时,将签名文件的摘要值与对 JAR 文件中的相应项计算的摘要值进行比较。


清单 1. 签名 JAR 中的 Manifest 和 signature 文件

Contents of signature file META-INF/MANIFEST.MF

Manifest-Version: 1.0
Created-By: 1.3.0 (Sun Microsystems Inc.)

Name: Sample.java
SHA1-Digest: 3+DdYW8INICtyG8ZarHlFxX0W6g=

Name: Sample.class
SHA1-Digest: YJ5yQHBZBJ3SsTNcHJFqUkfWEmI=

Contents of signature file META-INF/JAMES.SF

Signature-Version: 1.0
SHA1-Digest-Manifest: HBstZOJBuuTJ6QMIdB90T8sjaOM=
Created-By: 1.3.0 (Sun Microsystems Inc.)

Name: Sample.java
SHA1-Digest: qipMDrkurQcKwnyIlI3Jtrnia8Q=

Name: Sample.class
SHA1-Digest: pT2DYby8QXPcCzv2NwpLxd8p4G4=

数字签名

一个数字签名是.SF 签名文件的已签名版本。数字签名文件是二进制文件,并且与 .SF 文件有相同的文件名,但是扩展名不同。根据数字签名的类型 -- RSA、DSA 或者 PGP -- 以及用于签名 JAR 的证书类型而有不同的扩展名。

Keystore

要签名一个 JAR 文件,必须首先有一个私钥。私钥及其相关的公钥证书存储在名为 keystores 的、有密码保护的数据库中。JDK 包含创建和修改 keystores 的工具。keystore 中的每一个密钥都可以用一个别名标识,它通常是拥有这个密钥的签名者的名字。

所有 keystore 项(密钥和信任的证书项)都是用唯一别名访问的。别名是在用 keytool -genkey 命令生成密钥对(公钥和私钥)并在 keystore 中添加项时指定的。之后的 keytool 命令必须使用同样的别名引用这一项。

例如,要用别名“james”生成一个新的公钥/私钥对并将公钥包装到自签名的证书中,要使用下述命令:


keytool -genkey -alias james -keypass jamespass 
        -validity 80 -keystore jamesKeyStore 
        -storepass jamesKeyStorePass

这个命令序列指定了一个初始密码“jamespass”,后续的命令在访问 keystore “jamesKeyStore”中与别名“james”相关联的私钥时,就需要这个密码。如果 keystore“jamesKeyStore”不存在,则 keytool 会自动创建它。

jarsigner 工具

jarsigner 工具使用 keystore 生成或者验证 JAR 文件的数字签名。

假设像上述例子那样创建了 keystore “jamesKeyStore”,并且它包含一个别名为“james”的密钥,可以用下面的命令签名一个 JAR 文件:


jarsigner -keystore jamesKeyStore -storepass jamesKeyStorePass 
          -keypass jamespass -signedjar SSample.jar Sample.jar james

这个命令用密码“jamesKeyStorePass”从名为“jamesKeyStore”的 keystore 中提出别名为“james”、密码为“jamespass”的密钥,并对 Sample.jar 文件签名、创建一个签名的 JAR -- SSample.jar。

jarsigner 工具还可以验证一个签名的 JAR 文件,这种操作比签名 JAR 文件要简单得多,只需执行以下命令:


jarsigner -verify SSample.jar

如果签名的 JAR 文件没有被篡改过,那么 jarsigner 工具就会告诉您 JAR 通过验证了。否则,它会抛出一个 SecurityException , 表明哪些文件没有通过验证。

还可以用 java.util.jarjava.security API 以编程方式签名 JAR(有关细节参阅 参考资料)。也可以使用像 Netscape Object Signing Tool 这样的工具。

将已签名的Jar包清理,重新签名

1 .  resign . sh script (strips key ,  adds key ,  add  index ) # !/bin/sh
 
# $Id: resign.sh,v 1.3 2002/07/02 13:57:32 mvw Exp $
# This script resigns the jars 
# (remove old signature, add new signature)
 
# settings for present foo server

JDK =/ usr / java / j2sdk1 . 4.0
 
KEYSTORE
=../../ Frontend / webstart / key / fooKeystore
 
.   ./ files . sh
 
for  i in  $unsigned_files
do
  echo 
" --- "
  echo 
" unpacking $i .. "
  TMP
= tmp - $i
  
mkdir   $TMP
  cd 
$TMP
  unzip 
- ../ $i
  
chmod   - R u + rwx  *
  find 
.   - type f  |  xargs  chmod  u -x
  echo 
" changing META-INF stuff .. "
  cd META
- INF
  rm 
- *. SF
  rm 
- *. DSA
  
#  this will determine the line number of the first blank line in MANIFEST.MF
  # (a blank line here is anything that has no letter/number)

  CUT = `egrep  - nv  ' ^.*[a-z|A-Z|0-9]+.*$ '  MANIFEST . MF | sed s /://| head  - 1 | tr  - " " `
  
if  [  - " $CUT "  ]; 
  then 
    echo 
" no cut detected "
  
else  
    echo 
" cutting MANIFEST.MF at line $CUT .. "   &&  
    head 
- $CUT  MANIFEST . MF  > m . mf  &&  
    rm 
- f MANIFEST . MF  &&  
    mv m
. mf MANIFEST . MF  &&  
    cat MANIFEST
. MF;
  fi
  echo 
" repacking $i .. "
  cd 
..
  rm 
- ../ $i
  zip 
- q9r  ../ $i   .
  cd 
..
  rm 
- rf  $TMP
  echo 
" signing $i .. "
  
$JDK / bin / jarsigner  - keystore  $KEYSTORE   - storepass foopassword  $i  fookeyname
  echo 
" verifying the signatures of $i .. "
  
$JDK / bin / jarsigner  - verify  $i
  echo indexing 
$i   ..
  
$JDK / bin / jar  - $i
done


2 .  files . sh (a list of files to treat)

#  $Id: files.sh,v 1.1 2002/05/07 16:35:18 mvw Exp $
# Files list

# watch out for 
# - the double quotes,
# - the trailing space inside the quoted string,
# - the backslash immediatly following the closing quote


unsigned_files
=
" foo1.jar  "
" foo2.jar  "
" foo3.jar  "
" foo-help.jar  "
[
code]

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值