# 获取Android应用签名证书指纹

出于安全性原因，Android APK在正式发布的时候必须签名，详细参考 [Android 应用签名](https://source.android.google.cn/docs/security/features/apksigning?hl=zh-cn)

接口开发者也可以利用这一机制提升安全性，简单来说是这样：
- 应用注册或功能配置时，在开发者后台提交自己的签名证书指纹
- 应用运行过程中，接口带上指纹参数提交服务端
- 服务端验证注册指纹与实际应用指纹的一致性

## 获取证书指纹

有几种方式可以获取证书指纹（非技术人员推荐用第三种方式）：
- keytool 命令
- apksigner 命令
- 签名获取工具


> 注意，提交开发者证书指纹前，先确认
> - 需要md5、sha1还是sha256？
> - 是否去除原始值中的冒号
> - 是否区分大小写？

### keytool 命令

**keytool必须使用oracle的java发行版**

- 有keystore或jks签名文件时

```bash
// java 版本不能高于8，执行前需要在环境变量中添加 keytool 路径，或使用绝对路径
// xxx.keystore 为apk签名文件路径
$ keytool -v -list -keystore xxx.keystore
输入密钥库口令:  ******
证书指纹:
         MD5: 76:B4:CC:46:64:55:C7:4D:BD:BB:AA:94:74:BF:A4:DD
         SHA1: C0:CB:7F:19:FB:93:C5:F1:87:E6:67:94:4E:8C:14:AF:36:51:69:3A
         SHA256: CC:EF:6F:14:D1:AC:09:5E:56:60:EB:7F:FB:37:80:AE:21:F3:C1:A3:A2:99:86:DB:B8:B4:29:66:93:4C:EE:C9
         签名算法名称: SHA256withRSA
         版本: 3

```

- 只有release APK时
``` bash
// 若只有签名过的apk文件，则可以使用命令，xxx.apk是apk路径
$ keytool -printcert -jarfile xxx.apk

```

### apksigner 命令
`apksigner` 与 `keytool` 命令类似，是比较新的命令 
```
// ${ANDROID_HOME}/build-tools/33.0.1/apksigner.bat
$ apksigner verify -v --print-certs xxx.apk
```

### 签名获取工具
安装到设备中的 APK，可以用一个工具应用来获取它的证书签名  
下载[4399 APK签名监测工具](http://sdkftp.4399doc.com/internal/app/1.0/operate.checker-sdk-1.0.0-SNAPSHOT%2B5-release.apk)，按照[使用说明](http://sdkftp.4399doc.com/internal/app/1.0/user_guide.html) 