这个大家应该都熟悉,可以理解为就是给自己要发布的apk签个名,代表apk是我做的,别人不能修改或者伪造,一般指当应用需要升级时,不能随意上传一个包名一样的apk到应用市场上,想要修改应用市场apk只能拿着一样签名的apk上传,有点像信用卡签名~
签名需要一个签名文件
遵循规则:私钥加密,公钥解密
大家知道,在与对方进行通信时,想要保证通信内容的可靠性,必须要确保两个问题:
为了确保这两个问题,就需要对发送的内容进行加密,而加密算法和密码等为了使用方便可以保存在一份文件中,这个文件就是我们说的签名文件。
使用规则:
首先内容的发送者需生成一对公钥,并且把公钥给到对方也就是内容的接收者
当发送者给接收者发送内容时,内容中除了要包含原来的实际内容,还要加上另外一段内容,这段内容是对原始内容进行提取摘要信息(对原始内容进行某一种算法比如md5 base64后得到的值)后再进行公钥加密得到的内容,也就是数字签名。
当接收者受到内容时,也包含两部分,一个是实际发送的内容,还有一个就是那段数字签名。收到后需要验证内容的真实性,同理采用和发送者一样的方式,首先采用和发送者一样的算法提取内容的摘要信息,然后使用公钥解密后得到具体值,可通过判断摘要信息和具体值是否和发送方的一致,进而验证内容是否真实。
签名文件有两种:
一种是后缀名 .jks文件
一种是后缀名 .keystore文件
通过AnroidStudio使用图形化界面工具生成的为 .jks文件,使用命令行生成的为.keystore文件,其实质和使用方式是一样的。
接下来看下这两种使用过程
1.使用命令行方式生成 .keystore文件,简单快速:
keytool -genkey -alias mykey -keyalg RSA -validity 40000 -keystore demo.keystore
#说明:
# -genkey 产生密钥
# -alias mykey 别名 mykey
# -keyalg RSA 使用RSA算法对签名加密
# -validity 40000 有效期限4000天
# -keystore demo.keystore
例如:
gmfdeMac-mini:GMF gmf$ keytool -genkey -alias android -keyalg RSA -validity 4000 -keystore release.keystore
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: HuangChun
您的组织单位名称是什么?
[Unknown]: GMF
您的组织名称是什么?
[Unknown]: GMF
您所在的城市或区域名称是什么?
[Unknown]: ShenZhen
您所在的省/市/自治区名称是什么?
[Unknown]: ShenZhen
该单位的双字母国家/地区代码是什么?
[Unknown]: CN
CN=HuangChun, OU=GMF, O=GMF, L=ShenZhen, ST=ShenZhen, C=CN是否正确?
[否]: Y
输入 的密钥口令
(如果和密钥库口令相同, 按回车):
gmfdeMac-mini:GMF gmf$
查看项目目录下,就可已看到生成的release.keystore文件了。
2.使用AndroidStuido图形化界面工具生成 .jsk签名文件:
选择菜单栏 Buid -> Generate Signed Apk… -> Next -> Next -> CreateNew(选择签名文件存放路径,设置文件密码,别名,签名密码,及相关信息等)-> Next -> reset master password(忘记了重置一个常用密码即可)-> 显示Reveal in Finder窗口 (打开后显示的是已签名的apk文件目录)-> 然后在目录下就有一个 .kjs文件,这就是我们的签名文件
1.使用命令行签名
使用产生的keystore对apk签名,使用到的是jarsigner.exe (windows),Mac类似,命令如下
jarsigner -verbose -keystore demo.keystore -signedjar test_signed.apk test.apk mykey
# test_signed.apk是签名之后的文件
# test.apk是需要签名的文件
另外需要注意的是,如果你的jdk版本在1.7以上,你在对apk签名时,需要加上这个参数,否则会出现:Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]的错误。:
-digestalg SHA1 -sigalg MD5withRSA
2.使用AndroidStudio配置签名文件签名,首先要修改gradle中的签名配置,在android节点下面添加一下内容,然后打包即可获得签名的正式包:
signingConfigs {
debug {
// 配置debug版本的数字签名证书
storeFile file("/Users/gmf/Desktop/Coding/GMF/GMF/release.keystore")
storePassword "123456"
keyAlias "android"
keyPassword "123456"
}
release {
// 配置release版本的数字签名证书(为了方便,这里的release版本和debug版本共用一个数字签名证书)
storeFile file("/Users/gmf/Desktop/Coding/GMF/GMF/release.jks")
storePassword "123456"
keyAlias "android"
keyPassword "123456"
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
这里只是展示了两种签名文件,debug模式不需要签名可不配置。
1、查看keystore的信息
keytool -v -list -keystore my-release-key.keystore
-list:列出密钥库中的条目。
-keystore:数字证书位置。
输入命令后,是需要输入签名密码的。
例如:
gmfdeMac-mini:GMF gmf$ keytool -list -keystore release.keystore -alias android -v
输入密钥库口令:
别名: android
创建日期: 2017-10-25
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=HuangChun, OU=GMF, O=GMF, L=ShenZhen, ST=ShenZhen, C=CN
发布者: CN=HuangChun, OU=GMF, O=GMF, L=ShenZhen, ST=ShenZhen, C=CN
序列号: 5a6c1f9b
有效期开始日期: Wed Oct 25 16:07:23 CST 2017, 截止日期: Sat Oct 07 16:07:23 CST 2028
证书指纹:
MD5: 0A:65:51:8D:A7:6C:7C:E3:A8:52:38:0A:2D:83:6F:23
SHA1: C8:B7:E7:2E:58:21:E2:68:61:F1:CB:B6:A2:92:43:1B:52:F1:1D:65
SHA256: 64:DE:2F:AA:99:1D:80:0C:DC:EB:B2:65:5D:4D:EF:7B:C7:9C:DD:82:3F:3B:C9:B3:28:F7:2A:67:4D:BE:72:2D
签名算法名称: SHA256withRSA
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: A1 39 7F 79 85 F3 92 D5 B0 36 FF 99 EF 70 8A 36 .9.y.....6...p.6
0010: 0A 11 BA E7 ....
]
]
gmfdeMac-mini:GMF gmf$
2、查看keystore的公钥证书信息
keytool -list -keystore demo.keystore -alias mykey -rfc
注:获取Base64格式的公钥证书,RFC 1421)
例如:
gmfdeMac-mini:GMF gmf$ keytool -list -keystore release.keystore -alias android -rfc
输入密钥库口令:
别名: android
创建日期: 2017-10-25
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
-----BEGIN CERTIFICATE-----
MIIDZTCCAk2gAwIBAgIEWmwfmzANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJDTjERMA8GA1UE
CBMIU2hlblpoZW4xETAPBgNVBAcTCFNoZW5aaGVuMQwwCgYDVQQKEwNHTUYxDDAKBgNVBAsTA0dN
RjESMBAGA1UEAxMJSHVhbmdDaHVuMB4XDTE3MTAyNTA4MDcyM1oXDTI4MTAwNzA4MDcyM1owYzEL
MAkGA1UEBhMCQ04xETAPBgNVBAgTCFNoZW5aaGVuMREwDwYDVQQHEwhTaGVuWmhlbjEMMAoGA1UE
ChMDR01GMQwwCgYDVQQLEwNHTUYxEjAQBgNVBAMTCUh1YW5nQ2h1bjCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBAJw1ARCyNlZhTdYBHZNVBTqMBLYwqUwC4KgA2T4AuXR/rX0/gnKvASil
CsU5eRvpMreSYNKwulqaPBJ614W3AzZ4wmV63CU6KSiJ/ipYweqksGEM1xUGzq+deoB31fn4Skw1
+7FrRZpUzlgc+ut5xc8xHXUqUiiRZwuONul2i5cK+epePF8ldPb+rASSc5e0TzhAOPyogwhTGiDT
u2tbjArccIAnyfTi38YigoGQJ4rHlADE79cCqAwV0hJZkFI1PP6qDdSEYe9DcgUWzbHslTqUhViz
HsZDvAlD0qriD9qw7QJNZjuWnqROc1lA+V1mug74/3/RpLUGV1bcp8mFr10CAwEAAaMhMB8wHQYD
VR0OBBYEFKE5f3mF85LVsDb/me9wijYKEbrnMA0GCSqGSIb3DQEBCwUAA4IBAQBRDkoxgcrVIsX2
xD2ePHiIUVu/jKaC7aeRokWFRpcmS2UUqTShNvs206HiKV4RYG7VkOY/hL69ZJdY96wlxTU4q/Z3
5J0uImIzzK49ZY++oa9Hh6glA0EOzm9ehSBl4ocTXVgfysAmELTSTexm5zs+AlA/2PZ/xiCvMdnT
oRAvmHvwcx7a/v9ZUShbnkFYAf36jYmaaGKLog8NFDJETpDVS5ml8S80jFvwxAOyc/fQFFejbCXc
ShMj6cA7Zzk28dPyscKMrkG7m2a17BC7pA8VdJFcW144nsq8RXhGFVP2kJYY5wB2e1wfN1x6rUB9
1prUdJ9gA/RrKSlJcIOhCLSm
-----END CERTIFICATE-----
gmfdeMac-mini:GMF gmf$
3、查看apk的签名信息
jarsigner -verify -verbose -certs <your_apk_path.apk>
参考内容
Android应用数字签名详解
Android签名机制之—签名过程详解
Android Studio 权威教程 打包、生成jks密钥、签名Apk、多渠道打包
Android签名机制介绍:生成keystore、签名、查看签名信息等方法