您的位置:首页 > 移动开发 > Android开发

手动给Android APK签名

2014-03-03 10:33 218 查看
一、使用OpenSSL创建证书文件

1、编译OpenSSL

1.1准备:

http://www.openssl.org/下载最新的源码,解压到任意文件夹下,例如:d:\openssl。

在Win7+VS2010下编译OpenSSL,需要安装Perl(ActiveStatePerl),从http://www.perl.org/下载。

安装Perl,添加..\Perl\bin到环境变量,方便使用。

1.2编译:

以下编译过程来自OpenSSL文件夹下INSTALL.W32。

1)运行CMD,进入命令提示符界面。

2)找到OpenSSL解压目录,如:d:\openssl,输入语句:Perl configure VC-WIN32(特别注意此处VC-WIN32应大写,否则编译报错),这一步主要确定系统的环境,使用什么编译器,默认安装路径及其他一些选项。或输入:perl Configure VC-WIN32 no-asm--prefix=e:/openssl(OpenSSL源代码的解压目录)。

3)在openssl目录下运行ms\do_ms.bat,则有以下输出,这一步可以生成编译脚本。

4)从开始菜单打开 Visual Studio 命令提示(2010),在openssl目录下运行以下命令:nmake -f ms\ntdll.mak。

如果编译成功,则输出都会在..\openssl\out32dll目录下,包括openssl.exe。

如果想编译Debug的版本则执行:

perl Configuredebug-VC-WIN32 no-asm --prefix=e:/openssl

(先编译Release版本,再编译Debug版,否则会出错,原因不明。)

网上还有执行上述操作错误的补充,我没有遇到,先记下:

<!--执行4)之前,需要做一些操作:

(1)去掉编译文件中CFLAG的/WX选项:

动态库修改openssl\ms\ntdll.mak文件;静态库修改openssl\ms\nt.mak文件。

注:/WX(将所有警告都视为错误),具体参见帮助文档:http://msdn.microsoft.com/zh-cn/library/thxezb7y.aspx

(2)设置VC环境变量:

在openssl编译的命令提示符窗口,进入VC安装路径(nmake.exe所在目录),执行vcvars32.bat脚本。执行成功后,再返回openssl目录。

执行4)操作,可能出现的错误:

提示NMAKE报错,搜索nmake.exe,将路径加入到系统环境变量Path里面,继续执行4);提示cl.exe错误,错误码最后为135。google搜索一番后,网上说找不到mspdb60.dll导致,在C盘全盘搜索该文件,无果!需设置VC环境变量。

继续报错,提示找不到nasmw。google无果,查看NASM下载包中确实没有该文件,继续google后,有网友说直接将nasm.exe改名为nasmw.exe,稳妥起见,复制nasm.exe一份然后改名为nasmw.exe(该目录下同时存在nasm.exe和nasmw.exe),继续执行4),编译成功。
-->

2、生成证书KEY

2.1产生RSA私钥
cb3c
(private key)


运行CMD进入openssl.exe所在目录,运行如下命令:

openssl genrsa-3 -out testkey.pem 2048

-3 是算法的参数(publicexponent)。

2048 是私钥长度。

testkey.pem 是输出的文件。

成功生成:testkey.pem。

2.2产生PKCS#10格式的认证请求,所谓认证请求就是发给认证机构认证的一个请求,它主要包括一个公钥和一些相关信息(如组织名称和联系人邮件地址)

运行命令openssl req -new-x509 -key testkey.pem -out testkey.x509.pem -days 10000,openssl会提示你输入相关信息,这里的信息可以根据你自己的实际情况填写。

以下为网上摘录:

openssl req -new -x509 -keytestkey.pem -out testkey.x509.pem -days 10000

 

You are about to be asked to enterinformation that will be incorporated

 into your certificate request.

 What you are about to enter is what is calleda Distinguished Name or a DN.

 There are quite a few fields but you can leavesome blank

 For some fields there will be a default value,

 If you enter ‘.’, the field will be leftblank.

 

Country Name (2 letter code)[GB]:CN

 State or Province Name (full name)[Berkshire]:GuangDong

 Locality Name (eg, city) [Newbury]:ShenZhen

 Organization Name (eg, company) [My CompanyLtd]:Topwise

 Organizational Unit Name (eg, section)[]:Broncho

 Common Name (eg, your name or your server’shostname) []:broncho.cn

 Email Address []:bronchosales@gmail.com

 

输入这条命令以后有可能会出现以下错误信息:

Unable to load config infofrom /usr/local/ssl/openssl.cnf 
只要把openssl目录下的openssl.cnf文件复制到c:/usr/local/ssl/目录下即可(目录不存在则手动创建之)。

或者使用如下命令指定openssl.cnf的位置:

openssl req -new -x509 -key testkey.pem -config "..\openssl\openssl.cnf"-outtestkey.x509.pem -days 10000
成功生成:testkey.x509.pem。
2.3把私钥的格式转换成PKCS #8(Private-Key Information Syntax Standard.)
输入命令:
openssl pkcs8 -in testkey.pem -topk8 -outform DER -out testkey.pk8 –nocrypt
私钥是不能让别人知道的,否则就起不到保密的作用了。私钥通常是要加密保存的,但这里指定了-nocryp,表示不加密。
成功生成:testkey.pk8。
二、签名
Android提供了为jar/zip文件签名的程序signapk.jar。
它的用法如下:
Usage: signapk publickey.x509[.pem] privatekey.pk8 input.jaroutput.jar
第一个参数是公钥,即前面第二步产生的testkey.x509.pem。
第二个参数是私钥,即前面第三步产生的testkey.pk8。
第三个参数是要签名的文件。
第四个参数是输出的文件(即签名后的文件)。
如:java -jarsignapk.jar testkey.x509.pem testkey.pk8 update.zip update-signed.zip
签名的作用
签名的主要目的为了检测文件是否被别人修改了。但它并不能禁止别人修改,因为你完全重新生成签名,但是你生成的签名和原来是不一样的。
优化APK:
zipalign -v 4 MyDemo_signed.apk MyDemo_new.apk
查询APK是否优化过:
zipalign -c -v 4 MyDemo.apk
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android apk openssl 签名