0%

Android签名相关内容

1. 查看签名

  • 提取签名
    jar xf HelloWorld.apk META-INF/CERT.RSA

  • 打印签名
    keytool -printcert -file CERT.RSA

  • 打印公钥,签名用的公钥
    keytool -printcert -file CERT.RSA -rfc,或者导出到一个文件keytool -printcert -file CERT.RSA -rfc > my_pub.key

相同的签名的不同版本APK应用相同的md5,sha1,sha256指纹,代表同一个公钥签名。

2. 查看public key的指纹

指纹就是用散列算法计算公钥的文本,rfc格式(带有-----BEGIN CERTIFICATE----------END CERTIFICATE-----)。

使用上面步骤得到的my_pub.key,验证md5。实际工作中不需要,工具都帮我们做好了。

1
2
3
openssl x509 -noout -fingerprint -md5 -inform pem -in my_pub.key
openssl x509 -noout -fingerprint -SHA1 -inform pem -in my_pub.key
openssl x509 -noout -fingerprint -SHA256 -inform pem -in my_pub.key

3. 查看keystore中的签名

keystore中有多个公钥秘钥对,一个对就是一个alias, 每个的访问密码不同。
keytool -list -keystore my.keystore -alias myAlias输入库密码可以看到公钥的指纹。

4. 给apk签名

jarsigner -verbose -keystore my.keystore -signedjar ma_app_signed.apk my.apk myAlias

5. Android Studio Debug签名

默认Android Stuido Debug时会自动签名(这个是IDE生成的,gradle命令行不会自动生成签名),用的keystore是没有密码的,但是有时候我们调试第三方登录,需要固定的签名,所以就自己生成签名,覆盖默认的Debug的签名。

5.1 生成Debug签名

$ keytool -genkey -v -keystore debug.keystore -storepass android -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 -dname "C=US, O=Android, CN=Android Debug"
https://gist.github.com/henriquemenezes/70feb8fff20a19a65346e48786bedb8f
这里需要注意的是,如果用的JDK8里面的keytool生成的keystore是没有问题的。但是用JDK11里面的keytll生成keystore会报错:Invalid keystore forma。两种方案:

  • 用回JDK8的keytool生成keystore
  • 用Android Studio生成keystore

5.2 设置keystore.properties

keystore.properties

1
2
3
4
storePassword=myStorePassword
keyPassword=mykeyPassword
keyAlias=myKeyAlias
storeFile=myStoreFileLocation

5.3 设置app/build.gradle

模块的build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 在模块的 build.gradle 文件中,于 android {} 块的前面添加用于加载 keystore.properties 文件的代码。
def keystorePropertiesFile = rootProject.file("keystore.properties")

// Initialize a new Properties() object called keystoreProperties.
def keystoreProperties = new Properties()

// Load your keystore.properties file into the keystoreProperties object.
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

android {
signingConfigs {
debug {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}
...
}

这样设置后,debug签名就更换成我们设置的签名了。但是./graldew assembleRelease还是要设置buildTypes才能使用release签名。

1
2
3
4
5
6
7
buildTypes {
release {
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
signingConfig signingConfigs.release
}
}

https://developer.android.com/studio/publish/app-signing
https://blog.csdn.net/zouchengxufei/article/details/48747803
https://www.cnblogs.com/littleatp/p/5922362.html

6.获取私钥

jks文件中的私钥不能直接得到,需要通过openssl将jks文件转换成pfx格式后再进行提取。
执行如下命令将server.jks文件转换成server.pfx文件:

1
2
3
keytool -v -importkeystore -srckeystore server.jks -srcstoretype jks -srcstorepass 123456 -destkeystore server.p12 -deststoretype pkcs12 -deststorepass 123456 -destkeypass abc123

openssl pkcs12 -in server.pfx -nocerts -nodes -out server.key

https://jingyan.baidu.com/article/066074d61de50cc3c21cb0ba.html

7.多个alias

https://www.cnblogs.com/whatlonelytear/p/7654689.html