zoukankan      html  css  js  c++  java
  • jdk工具keytool和jarsigner帮助Part2(jdk keytool&jarsigner tool manual)

    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的介绍,请参考本文的第一部分。

    转:http://blog.csdn.net/sunjavaduke/article/details/3998859

  • 相关阅读:
    Android系统进程Zygote启动过程的源代码分析
    Android系统默认Home应用程序(Launcher)的启动过程源代码分析
    Android应用程序安装过程源代码分析
    Android应用程序进程启动过程的源代码分析
    Android应用程序绑定服务(bindService)的过程源代码分析
    Android应用程序发送广播(sendBroadcast)的过程分析
    Android应用程序注册广播接收器(registerReceiver)的过程分析
    Android系统中的广播(Broadcast)机制简要介绍和学习计划
    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:
    解开Android应用程序组件Activity的"singleTask"之谜
  • 原文地址:https://www.cnblogs.com/xhqgogogo/p/3681661.html
Copyright © 2011-2022 走看看