zoukankan      html  css  js  c++  java
  • 【keytool jarsigner工具的使用】Android 使用JDK1.7的工具 进行APK文件的签名,以及keystore文件的使用

    一个android apk的编译过程 请参考:

    http://www.2cto.com/kf/201312/261475.html

    典型的编译过程:
    
    aapt( Android Asset Packaging Tool): 把你的应用程序资源文件(例如: AndroidManifest.xml file and the XML files for your Activities),编译成R.java 。它可以让你从java代码中引用你的资源。
    
    aidl :转换.aidl 接口成为java接口
    
    java编译工具(javac):所有的java代码(包括 :java源码,R.java , .aidl 转换后的接口文件)由java编译工具(javac) 编译成中间代码(.class) 文件。
    
    dex工具(dx):转换中间代码和第三方库的中间代码为Dalvik byte codeapk建立工具:把所有不需要编译的资源,编译的资源和Dalvik代码(.dex)打包成 .apk 文件签名(jarsigner).apk 建立后,它必须被签名才能安装到设备上,否则设备会拒绝安装。
    
    因为编译工具包含了调试签名的私钥,所以在编译时就直接签名了。但是你要发行版本时,你必须自己对apk包进行签名。
    
    对齐工具(zipalign):最后,还需要用zipalign工具对包进行对齐。

    安装JDK,确保可以使用keytool jarsigner两个工具,因为apk格式其实就是jar,jar又是基于zip格式 添加一些扩展内容的格式.

    1.制作签名工具
    C:>where keytool
    C:Program FilesJavajdk1.7.0_45inkeytool.exe
    2.进行签名工具
    C:>where jarsigner
    C:Program FilesJavajdk1.7.0_45injarsigner.exe

    签名分两个部分:

    生成私钥

    keytool:

    Keytool 选项描述
    -genkey 产生一个键值对(公钥和私钥)
    -v 允许动作输出
    -alias<alias_name> 键的别名。只有前八位字符有效。
    -keyalg 产生键的加密算法。支持DSA和RSA。
    -keysize 产生键的长度。如果不支持,keytool用默认值1024 bits.通常我们用2048 bits 或更长的key。
    -dname

    专有名称,描述谁创建的密钥。该值被用作自签名证书的颁发者和主题字段。注意你可以不在命令行指定。如果没有指定keytool会提示你(CN, OU, and so on)。

    -keypass

    键的密码。

    主要为了安全起见,如果没提供,keytool会提示你输入。

    -validity

    键的有效期,单位:天

    Note: A value of 10000 or greater is recommended.

    -keystore.keystore 用于存储私钥的文件。
    -storepass

    私钥存储文件的密码。

    主要为了安全起见,如果没提供,keytool会提示你输入。这个密码不会存储在你的shell历史记录中。

    keytool -genkey -v -keyalg DSA -keysize 1024 -sigalg SHA1withDSA  -validity 20000  -keystore MyDevel.keystore -alias devel   -keypass MyDevel -storepass MyDevel

    用私钥进行签名

    jarsigner:

    Jarsigner 选项描述
    -keystore.keystore 包含你私钥的存储文件
    -verbose 显示输出动作。
    -sigalg 签名算法,用 SHA1withRSA.
    -digestalg 消息摘要算法,用 SHA1.
    -storepass

    存储文件的密码。

    主要为了安全起见,如果没提供,jarsigner会提示你输入。这个密码不会存储在你的shell历史记录中。

    -keypass

    私钥的密码。

    主要为了安全起见,如果没提供,jarsigner会提示你输入。这个密码不会存储在你的shell历史记录中。

    jarsigner  -verbose -sigalg SHA1withDSA -digestalg SHA1  -keystore myDevel.keystore -storepass MyDevel test.apk devel

    用eclipse工具进行签名:

    在工程上点右键->android tools->export singedappplication package

     

    用已经存在的keystore KEY存储文件签名:

    也可以创建一个新的keystore文件:

     这里validity 年的有效期为1-1000哦..其他就错了,改成500试试.

    同样是MyDevel.keystore,一个是jarsigner签名,一个是eclipse签名。

    对齐工具(zipalign):

    一旦你已经签署了APK与你的私钥,在文件上运行zipalign。此工具可确保所有未压缩的数据开始于一个特定的字节对齐,相对于文件的开始。当一个设备上安装,确保对齐在4字节边界提供了性能优化。当对齐,Android系统能够读取文件使用mmap(),即使它们包含与对齐限制二进制数据,而不是复制所有从包中的数据的。其好处是在RAM中的运行应用程序所消耗的量减少。

    zipalign -v 4 HelloWorld.apk HelloWorld_Release.apk

    =========================================

    在使用jarsigner签名的时候,遇到无法安装,提示无签名的错误:

    正常的安装应该是:

    C:>adb install test.apk
    360 KB/s (19576 bytes in 0.053s)
            pkg: /data/local/tmp/test.apk
    Success

    如果已经安装,adb貌似无法直接覆盖安装

    C:>adb install test.apk
    367 KB/s (19576 bytes in 0.052s)
            pkg: /data/local/tmp/test.apk
    Failure [INSTALL_FAILED_ALREADY_EXISTS]

    对于【没有签名或签名有错误】的安装为

    C:>adb install test_Unsigned.apk
    315 KB/s (18113 bytes in 0.056s)
            pkg: /data/local/tmp/test_Unsigned.apk
    Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]

    其他人也遇到过这个问题:如这位兄弟所言

    JDK1.7签名APK异常 http://blog.csdn.net/sgz_china/article/details/8060315

    错误的签名为:

    C:>jarsigner  -verbose  -keystore myDevel.keystore -storepass MyDevel test.apk devel
       正在添加: META-INF/DEVEL.SF
       正在添加: META-INF/DEVEL.DSA
      正在签名: res/layout/main.xml
      正在签名: AndroidManifest.xml
      正在签名: resources.arsc
      正在签名: res/drawable-hdpi/icon.png
      正在签名: res/drawable-ldpi/icon.png
      正在签名: res/drawable-mdpi/icon.png
      正在签名: classes.dex
    C:>adb install test.apk
    349 KB/s (19697 bytes in 0.055s)
            pkg: /data/local/tmp/test.apk
    Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
    
    C:>

    主要是去掉了 jarsigner的两个参数:  -sigalg SHA1withDSA -digestalg SHA1 

    其实在Android官网有说明的:

    http://developer.android.com/tools/publishing/app-signing.html#setup 

    Caution: As of JDK 7, the default signing algorithim has changed, requiring you to specify the signature and digest algorithims (-sigalg and -digestalg) when you sign an APK.
    jarsigner  -..... -sigalg SHA1withRSA -digestalg SHA1 ...

    JDK1.7 由于默认签名算法改变,需要指定 签名算法 和 密钥  算法.应该是对应keytool的

    -sigalg <sigalg>签名算法名称

    -keyalg <keyalg> 密钥算法名称

    两个参数.

    ===============

    另外关于签名后的META-INFO中的 SF RSA文件名

    不过默认的APK的META-INFO的签名后的文件名是 CERT.SF 和 CERT.RSA. 我使用jarsigner 签名后 就是 那个 <alias>.SF <alias>.RSA。;用eclipse签名的就是这种命名。

    这个CERT应该不是keytool指定的alias吧? 可以通过其他方式改成这个名字么?不知道,直接修改apk,那么apk的zip头信息中的签名信息将会被修改掉,导致无法安装了。

    ======================

    TODO:关于APK签名,还有一种是Android源码中的 signapk.jar [编译 打包后,有SignApk.java的源码文件的]

    使用方法:

    Usage: signapk publickey.x509[.pem] privatekey.pk8 input.jar output.jar

    其中

    testkey.pk8 是二进制,

    0?? 0
        *咹嗺
     ???? ? 謸奁$表莃噘?>>蚻??尐杓ㄍk觴n?�???Y?w〤玷=Kd镐�渔V疋g?坎0祒?C綥r窮?嗮8�壜?幘蠌拭??申撔�躂驪"
    P2鄝?頹3Y姒旍,瞅劆�葄斬;1    :g7./d纍mB馲唼佁訢趌菝?XH?dO哭樕(wH埘gjT
    乀然?光GU3膋汍o揿處i缛⑿巟& ?檙}<�?欉洰8牪?[j�? ?籜攧m梭贏?錸)3濖飒]硼}呸G釶I谋捏D    ?f#慤;~鷓罪?茼袠┝鈾廗霦?v?ブ瓊~荨e?NY鮷4[?z?5
    ?<梪垴粪o阻1鲓羄5Z痺@U?鬍u�y???v銷X6≮ud�?�┛?�?)錳楛j襸櫑鼔w襡L氇|u;溭Ldg庤鼼k~饷~昗漰Do珦?玣J蓸??+R六抨d颙?I??x?H?蹽v宿柦L�{亖 昀?洉'?繛桬匴憊灖?龊撪吱H魔
    ﹁á赟hgk3掘樆M汎祷?F?,蛅v瓴酛w掔� 祿*鱃鞴wU?
    柏#v媂j駖m凝@?厙o_
    ,交啛!y玌p�zu{a?亖 辋?4ǒ7欑珬漗u柇峣fI?洧?/b$4M+垑┨濏Go0.躈鎇陊綉蝠L?4??D(�郩[葡N?aC~ |硭綴彵K2`MA62r?)?e"乫7~疑?洀?崤慇?亖 渶fhg概*i?X?�?r�b曚p0??餻l憣餌?Le???襰l/Mr葓鳲G!g雴?歴鵘蝏ぺ?O嶼u錡l葫?聆R筘ㄕ舉i甖J?右Y縦�8跄鍽'杇亖 ?Of#zf?re?9?鸶钲筯榣sZ?Amx3r[
    茍iH贘 =夘珩?鱆?x|y{偱?@8缳邏虼@砖UW�噁~鎋藝d藹3€翁LνqE狢h? 钕┽叟f?_枭A.?3亐c*�荬b贂�b[桐F!糸Ys顝?雚×??
    症塽?j{雗Ua础,`¥i飠wX+5区U狗l氏纖HE�E/便�麣�h拍I?鳞�;喳亙)4v広z????{塭邚鬄?

    使用winhex复制16进制为:

    308204BD020100300D06092A864886F70D0101010500048204A7308204A30201000282010100D6931904DEC60B24B1EDC762E0D9D8253E3ECD6CEB1DE2FF068CA8E8BCA8CD6BD3786EA70AA76CE60EBB0F993559FFD93E77A943E7E83D4B64B8E4FEA2D3E656F1E267A81BBFB230B578C20443BE4C7218B846F5211586F038A14E89C2BE387F8EBECF8FCAC3DA1EE330C9EA93D0A7C3DC4AF350220D50080732E0809717EE6A053359E6A694EC2CB3F284A0A466C87A94D83B31093A67372E2F6412C06E6D42F15818DFFE0381CC0CD444DA6CDDC3B82458194801B32564134FBFDE98C9287748DBF5676A540D8154C8BBCA07B9E247553311C46B9AF76FDEECCC8E69E7C8A2D08E782620943F99727D3C04FE72991D99DF9BAE38A0B2177FA31D5B6AFEE91F02010302820101008F0CBB589484076DCBF3DA41EB3BE56E297F339DF213ECAA045DC5F07DC5DE47E25049C4B1C4F34409D20A662391553B7EFA70D7EFF028DCEDD098A9C1E2998F4BEC451ABD2A76CB23A5D6AD827EDDA165D02F4E160E59F57B16345BD7297AFFB47F350A872D3C149775DBF1B7E06FD7E831F78AC15E355AAF774055BA0FF44575A286798E35C533B40276E44E5836A1DA7564ADFAF538A493A9BF10F213A657AC12291C1BE56997FC6AD27B99A7FC8977D2654CEBAA7C753B9CDA4C64671A8EE8FD476B7EE2C37E95579D70441E6FAB93A413AB664AC998FA25943F2B52C1F9C5EA64EF4A1BCA0149E717A214017896080C48A407DC4776CBDE96BD4CA1847B02818100EAC099171C9B95278C07BF9E974518855791769EA7B52BF6BA93E0D6A848C4A70D18A6E8A8A2DA5368676B33BEF298BB144D9AF8B5BBAD2246F42C2CCD7476EAB21BE14A771F92E7ADF600B5932AF747F7B9775587110AB0D8032318768B586AF17C6DC4FD40A8181E85876F5F0A2CBDBB03869F2179AB5570A7597A757B619B02818100E9FEF71934A8AF3799E712AB979D5E027596AD8D69156649961CE4A2AD082F186224344D2B888914A9CC9DED476F302EDC4EE65BEA77BD91F2F04C3F34BA09B6394428FBB4E0555BC6CF4EEC0E61437E00037CEDCB19BE598FB14B1732604D41363272FA3429E87F651D11228166377ED2C9A8190B5C9B8FDD2DE1C5029140CD028181009C80660F6867B8C508052A69BA2E1058E50BA469C52372A47C6295E47030831A08BB19F0706C918CF044F2227F4C65D20D8911FB23D2736C2F4D72C888F84F472167EB86FA150C9A73F955CE621CA4DAA5264F8E5A0B5C75E5576CBAF9B23AF1F652F3D8A8D5C56569AE5A4A3F5C1DD3D20259BF6BA67238F5C4E651A3A79667028181009BFF4F66231B1F7A669A0C7265139401A3B9C908F0B8EEDBB968986C735ACA10416D7833725B060DC6886948DA4A201F3D89EEE7F1A5290BF74ADD7F787C06797B82C5FD234038E7D9DF89F2B440D7A95557A89E87667EE65FCB8764CC403380CECC4CA6CD7145AA4368B61700EECFA9E1DBC5660793125FE8C9412E01B62B33028180632AADD91ADDA462D995A672625B05CDA94621F4E95973EE8F9A2DEB71A1C1AC1BD31A0DD6A28975871B6A7BEB6E5561B4A12C60A3A469EF7A77582B35C7F855B9B76CCACFC0774845FEA9452FB1E3A98C05FB9AA7526819C5C4498E0DC1DB1BA58A3BD4FB8183291E34768EDA7AB4058726FD1C8D147B8965DF8F15F39EBC37

    testkey.x509.pem内容是:

    -----BEGIN CERTIFICATE-----
    MIIEqDCCA5CgAwIBAgIJAJNurL4H8gHfMA0GCSqGSIb3DQEBBQUAMIGUMQswCQYD
    VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4g
    VmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UE
    AxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAe
    Fw0wODAyMjkwMTMzNDZaFw0zNTA3MTcwMTMzNDZaMIGUMQswCQYDVQQGEwJVUzET
    MBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4G
    A1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9p
    ZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZI
    hvcNAQEBBQADggENADCCAQgCggEBANaTGQTexgskse3HYuDZ2CU+Ps1s6x3i/waM
    qOi8qM1r03hupwqnbOYOuw+ZNVn/2T53qUPn6D1LZLjk/qLT5lbx4meoG7+yMLV4
    wgRDvkxyGLhG9SEVhvA4oU6Jwr44f46+z4/Kw9oe4zDJ6pPQp8PcSvNQIg1QCAcy
    4ICXF+5qBTNZ5qaU7Cyz8oSgpGbIepTYOzEJOmc3Li9kEsBubULxWBjf/gOBzAzU
    RNps3cO4JFgZSAGzJWQTT7/emMkod0jb9WdqVA2BVMi7yge54kdVMxHEa5r3b97s
    zI5p58ii0I54JiCUP5lyfTwE/nKZHZnfm644oLIXf6MdW2r+6R8CAQOjgfwwgfkw
    HQYDVR0OBBYEFEhZAFY9JyxGrhGGBaR0GawJyowRMIHJBgNVHSMEgcEwgb6AFEhZ
    AFY9JyxGrhGGBaR0GawJyowRoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UE
    CBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMH
    QW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAG
    CSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJAJNurL4H8gHfMAwGA1Ud
    EwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHqvlozrUMRBBVEY0NqrrwFbinZa
    J6cVosK0TyIUFf/azgMJWr+kLfcHCHJsIGnlw27drgQAvilFLAhLwn62oX6snb4Y
    LCBOsVMR9FXYJLZW2+TcIkCRLXWG/oiVHQGo/rWuWkJgU134NDEFJCJGjDbiLCpe
    +ZTWHdcwauTJ9pUbo8EvHRkU3cYfGmLaLfgn9gP+pWA7LFQNvXwBnDa6sppCccEX
    31I828XzgXpJ4O+mDL1/dBd+ek8ZPUP0IgdyZm5MTYPhvVqGCHzzTy3sIeJFymwr
    sBbmg2OAUNLEMO6nwmocSdN2ClirfxqCzJOLSDE4QyS9BAH6EhY6UFcOaE0=
    -----END CERTIFICATE-----

    pem文件是openSSL生成的.但是跟keystore如何转换,不知道啊...

     =============================================

    新问题,签名一个68.2MB的apk,遇到的问题:

    C:>jarsigner  -verbose -sigalg SHA1withDSA -digestalg SHA1  -keystore .keystore -storep
    ass %PASSWORD% "test_unsignedk.apk" %ALIAS%
    jarsigner: 无法对 jar 进行签名: java.util.zip.ZipException: invalid entry compressed size (expecte
    d 35608 but got 35781 bytes)
    
    C:>

    我看了一下,在apk里面的 META-INFMANIFEST.MF 文件的大小刚刚好是35608。那么35781 又是那个获取的呢???

    另外 MANIFEST.MF 文件如果缺失,也无法签名的,应该如何自动生成这个文件呢?

    内容大致是:

    Manifest-Version: 1.0
    Created-By: 1.0 (Android)
    
    Name: assets/bin/Data/923d96261c2b64444b64f28a11275a11
    SHA1-Digest: YymIJSZJWwGCNdyKcK+IbYQeXIs=
    
    Name: assets/bin/Data/b0d7c3ef6f82be742a2695674230c34e
    SHA1-Digest: aUHI5vRckg5oZ4YRBtQuOn34xxo=
    
    .............
    .............


    使用signapk.jar 以及.pk8 .x509.pem 文件密钥 进行签名 却没有问题。

    发愁啊!不知其根本,连其基本用法都搞不懂!

    可以使用keystore文件,利用eclipse 工具的导出签名apk  来导出新的apk了。

  • 相关阅读:
    bzoj2733 永无乡 平衡树按秩合并
    bzoj2752 高速公路 线段树
    bzoj1052 覆盖问题 二分答案 dfs
    bzoj1584 打扫卫生 dp
    bzoj1854 游戏 二分图
    bzoj3316 JC loves Mkk 二分答案 单调队列
    bzoj3643 Phi的反函数 数学 搜索
    有一种恐怖,叫大爆搜
    BZOJ3566 概率充电器 概率dp
    一些奇奇怪怪的过题思路
  • 原文地址:https://www.cnblogs.com/ayanmw/p/3720804.html
Copyright © 2011-2022 走看看