该文章主要针对于android签名部分进行较为详细的说明,旨在理解签名的整体使用体系及keytool和apksigner的常见用法,重在实践意义。
在 Android 应用签名中,V1 V2 V3 V4签名是不同的签名方案,具体描述如下:
应用签名 | 对应官方文档链接如下:
这些官方文档更易于理解应用签名这件事儿。
签名的生成主要通过Android Studio/工具keytool使用(普通签名)或者Android Framework生成(主要针对系统签名)。这里的Keytool是Android开发工具包(Android SDK)中的一个工具,用于生成和管理数字证书、密钥对和证书请求。它是一个命令行工具,用于执行与密钥和证书相关的操作,例如创建密钥存储、生成密钥对、导出证书等。
Android Keytool的一些常见用途和功能如下:
$keytool -genkeypair -alias myalias -keyalg RSA -keysize 2048 -keystore keystore.jks
-genkeypair:生成密钥对的命令。
-alias myalias:指定密钥对的别名myalias。
-keyalg RSA:指定密钥算法为RSA算法。
-keysize 2048:指定密钥长度为2048位。
-validity 365 有效期365天,默认90天
-keystore keystore.jks:指定密钥库文件名为keystore.jks。
$keytool -exportcert -alias myalias -keystore keystore.jks -file certificate.crt
-exportcert:导出证书的命令。
-alias myalias:指定要导出的证书的别名。
-keystore keystore.jks:指定密钥库文件名为keystore.jks。
-file certificate.crt:指定导出的证书文件名为certificate.crt。
$keytool -importcert -alias myalias -file certificate.crt -keystore keystore.jks
-importcert:导入证书的命令。
-alias myalias:指定要导入的证书的别名。
-file certificate.crt:指定要导入的证书文件名为certificate.crt。
-keystore keystore.jks:指定密钥库文件名为keystore.jks。
$keytool -list -keystore keystore.jks
-list:列出密钥库中的条目的命令。
-keystore keystore.jks:指定要列出的密钥库文件名为keystore.jks。
$keytool -printcert -file certificate.crt
-printcert:查看证书详细信息的命令。
-file certificate.crt:指定要查看的证书文件名为certificate.crt。
使用工具keytool来查看apk签名,使用方法如下:
$keytool -printcert -jarfile XXX.apk
如果未签名或者keytool禁用的弱算法签名的,会显示:
$keytool -printcert -jarfile XXX.apk
不是已签名的 jar 文件
如果签名的话则会显示:
$keytool -printcert -jarfile XXX.apk
签名者 #1:
Certificate #1:
所有者: CN=XXX, OU=XXX, O=XXX, L=xxx, ST=xxx, C=XXX
发布者: CN=XXX, OU=XXX, O=XXX, L=xxx, ST=xxx, C=XXX
序列号: 706e325f
生效时间: Fri Jun 04 13:59:30 CST 2021, 失效时间: Sun May 11 13:59:30 CST 2121
证书指纹:
SHA1: 67:DC:CE:BD:3E:BB:67:AD:A4:CC:D6:65:B3:1C:2A:33:4F:B0:74:89
SHA256: 92:93:EE:B8:A3:4B:57:3D:32:0E:F7:D2:52:80:4A:74:E0:BB:16:00:11:7E:6E:B4:80:41:6B:FA:E4:6D:D5:EF
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 54 0C 4B 25 7D 3D E1 2D 1E 1C 9F 93 BE 1D 39 08 T.K%.=.-......9.
0010: 14 8E 32 00 ..2.
]
]
注意:这里如果使用高版本的keytool,有可能V1和V2的签名都会显示“不是已签名的 jar 文件”,但是V3会正常显示。
apksigner是Android SDK中提供的一个命令行工具,用于对Android应用程序(APK)进行数字签名。它是为了确保APK在发布和安装过程中的完整性和安全性而设计的。
apksigner的一些主要特点和功能如下:
使用apksigner工具进行V1 V2 V3 V4签名。apksigner.jar/apksigner工具是Android自带的工具中的命令,放在Sdk/build-tools/$版本号/目录下。
早期apksigner的版本是jar包,使用apksigner.jar文件和xxx.jks来给应用签名,具体操作如下:
$java -jar apksigner.jar sign --ks xxx.jks --ks-key-alias xxx1 --ks-pass pass:xxx2 --key-pass pass:xxx3 --out [签名后生成的文件/out输出参数] [需要签名的文件/in输入参数]
后来改为apksigner可执行文件,具体操作如下:
$apksigner sign --ks xxx.jks --ks-key-alias xxx1 --ks-pass pass:xxx2 --key-pass pass:xxx3 --out [签名后生成的文件/out输出参数] [需要签名的文件/in输入参数]
如果需要重新签名/更换签名,直接更换jks文件即可。这里涉及的参数说明如下:
--ks xxx.jks 密钥库名
--ks-key-alias xxx1 密钥别名,若密钥库有一个密钥对,则可省略,反之必选
--ks-pass pass:xxx2 解锁密钥库文件的密码
--key-pass pass:xxx3 解锁私钥的密码
对于签名的 还可以设置签名版本解决方案,如下所示:
--v1-signing-enabled 是否开启V1签名,默认开启
--v2-signing-enabled 是否开启V2签名,默认开启
--v3-signing-enabled 是否开启V3签名,默认开启
--v4-signing-enabled 是否开启V4签名,默认开启
关于sign的其他命令,可以使用 apksigner sign --help来查看。
常用参数说明如下:
-v 输出签名的模式V1/V2/V3/V4的值未true/false
--print-certs 打印签名详细信息
具体使用如下:
#这里的输出表示V2签名
$apksigner verify -v xxx1.apk
Verifies
Verified using v1 scheme (JAR signing): false
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): false
Number of signers: 1
#这里输出的表示V1+V2+V3签名
$apksigner verify -v xxx1.apk
Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): true
Number of signers: 3
#这里打印cert的详细信息
apksigner verify --print-certs xxx.apk
Signer #1 certificate DN: CN=xxx1, OU=xxx2, O=xxx3, L=xxx, ST=xxx, C=xxx
Signer #1 certificate SHA-256 digest: 6793eeb8a34b573d320ef7d25208a474e0bb1600117e6e4b80416bfae46dd5fe
Signer #1 certificate SHA-1 digest: 24dc9cbd3ebb67ada4bdd665b31c2a994fb07444
Signer #1 certificate MD5 digest: 1252800c8673bd059951fcaf66a5b91c
#同时使用参数-v和--print-certs,打印更全面的信息
$apksigner verify -v --print-certs xxx.apk
Verifies
Verified using v1 scheme (JAR signing): false
Verified using v2 scheme (APK Signature Scheme v2): false
Verified using v3 scheme (APK Signature Scheme v3): true
Number of signers: 1
Signer #1 certificate DN: CN=xxx1, OU=xxx2, O=xxx3, L=xxx4, ST=xxx5, C=xxx6
Signer #1 certificate SHA-256 digest: 6793eeb8a34b573d320ef7d25208a474e0bb1600117e6e4b80416bfae46dd5fe
Signer #1 certificate SHA-1 digest: 24dc9cbd3ebb67ada4bdd665b31c2a994fb07444
Signer #1 certificate MD5 digest: 1252800c8673bd059951fcaf66a5b91c
Signer #1 key algorithm: RSA
Signer #1 key size (bits): 2048
Signer #1 public key SHA-256 digest: 39e722630a16ebbc200a1cac68b2ac6689ae9f56bff911c229ef2a81f5c24b5c
Signer #1 public key SHA-1 digest: 5b9b6707d59e3aee0f844830cc3cc7074499fe2f
Signer #1 public key MD5 digest: 36cdbb8876ef2ffc59dcafeb59f26810
关于verify的其他命令,可以使用 apksigner verify --help来查看。