本文翻译整理自一俄罗斯同事的文档
一、前言
goolge为我们提供了4个标准的key,以签名测试程序:
testkey -- a generic key for packages that do not otherwise specify a key.
platform -- a test key for packages that are part of the core platform.
shared -- a test key for things that are shared in the home/contacts process.
media -- a test key for packages that are part of the media/download system.
它们位于
Android源码的以下目录
android\build\target\product\security
注意,这些key只是用于
工程版的Android系统.在编译时android源码时,使用
eng选项即表示编译生成工程版的Android系统,
而使用
user选项时表示编译用户版(即正式版)的Android系统。
二、使用key生成keystore文件
使用google的标准key生成
keystore
文件。我们需要2个工具,
openssl
(cryptography and SSL/TLS toolkit) and
keytool
。
openssl
是Linux上的一个工具,
keytool
则是JDK的一个工具,它位于
JDK\bin
目录。在此假设你已经把
JDK\bin
添加到了window的path环境变量中。
因为一般用户使用的是window系统,
所以我这里把Cygwin安装在window上来模拟Linux环境,在Cygwin上使用opnssl.
关于
Cygwi的
详细内容请参考《
cygwin安装详解
》。
2.1、命令行方式
在这里我将以platform为例进行讲解。
通过“
Cygwin Terminal”的进入
Cygwin的命令行,然后切换到key所在的目录。即security目录.
输入以下命令:
openssl
pkcs8
-inform DER -nocrypt -in
platform.pk8
-out
platform.pem
执行该命令,将在目录下生成
platform.pem文件
接着输入以下命令:
openssl
pkcs12
-export -in
platform.x509.pem
-out
platform.p12
-inkey
platform.pem
-password
pass:android
-name
androiddebugkey
执行该命令,将在目录下生成platform.p12文件,它本质上应该就是一个数字证书。
进入
DOS命令行,切换到key所在的目录。即security
然后输入命令:
keytool
-importkeystore
-deststorepass
android
-destkeystore
./platform.jks
-srckeystore
./platform.p12
-srcstoretype PKCS12 -srcstorepass
android
执行该命令,将在目录下生成
platform.jks文件,它就是我们需要的keystore文件。它的后缀本身是没有关系。如果你更喜欢其后缀名为keystore。
上面的命令改成这样就行了。
keytool
-importkeystore
-deststorepass
android
-destkeystore
./platform.keystore
-srckeystore
./platform.p12
-srcstoretype PKCS12 -srcstorepass
android
另外,我方便我们可以使用批处理来进行处理。
通过“Cygwin Terminal”的进入Cygwin的命令行,然后切换到key所在的目录。即security目录.
使用
sh ./export.sh命令运行
export.sh文件.
export.sh文件如下:
#!/bin/sh
FILES=`find . -name "*.pk8"`
cat > generateKeystore.bat << END
rem autogenerated file
END
for FILE in $FILES
do
FILE_NAME=`echo $FILE | awk -F.pk8 '{print $1}'`
if [ -f ${FILE_NAME}.pem ]
then
echo "file ${FILE_NAME}.pem exists"
else
`openssl pkcs8 -inform DER -nocrypt -in ${FILE} -out ${FILE_NAME}.pem`
fi
`openssl pkcs12 -export -in ${FILE_NAME}.x509.pem -out ${FILE_NAME}.p12 -inkey ${FILE_NAME}.pem -password pass:android -name androiddebugkey`
cat >> generateKeystore.bat << END
keytool -importkeystore -deststorepass android -destkeystore ${FILE_NAME}.jks -srckeystore ${FILE_NAME}.p12 -srcstoretype PKCS12 -srcstorepass android
END
done
在运行完成后,将在当前目录看到若干
*pem文件,
*.p12文件及一个
generateKeystore.bat文件,window中直接双击运行它。这时你将看到生成的*.jks文件,它们就是我们需要得keystore文件。
generateKeystore.bat文件如下:
rem autogenerated file
keytool -importkeystore -deststorepass android -destkeystore ./media.jks -srckeystore ./media.p12 -srcstoretype PKCS12 -srcstorepass android
keytool -importkeystore -deststorepass android -destkeystore ./platform.jks -srckeystore ./platform.p12 -srcstoretype PKCS12 -srcstorepass android
keytool -importkeystore -deststorepass android -destkeystore ./shared.jks -srckeystore ./shared.p12 -srcstoretype PKCS12 -srcstorepass android
keytool -importkeystore -deststorepass android -destkeystore ./testkey.jks -srckeystore ./testkey.p12 -srcstoretype PKCS12 -srcstorepass android
2.2、Keytool-IUI界面化方式。
Keytool-IUI
is Cryptography GUI 工具. It allows create, manage keys and certificates, encrypt and decrypt files.
可以在这里下载它 http://code.google.com/p/keytool-iui/downloads/detail?name=ktl241sta.jar&can=2&q=
在使用Keytool-IUI前,我们还是需要使用opensll来先生成.pem文件。
三、命令行中使用keystore对APK签名
关于此请参考《
APK签名》
四、查看APK使用的数字签名
解压APK文件,对其META-INF目录下的CERT.RSA文件,执行以下命令就可以到它的数字签名的详细情况
keytool
-printcert -file
CERT.RSA
另外在Android源码,可以通过应用程序
Android.mk文件的LOCAL_CERTIFICATE查看它使用的哪种key。
比如:
LOCAL_CERTIFICATE := platform