keytool 查看 Keystore 的 MD5 与证书指纹:命令、报错与一键速查
前端先给结论:看 Keystore 指纹就一条命令,但必须加 -v 参数——不加 -v 只列出 alias 名字,根本不显示 MD5 / SHA1 / SHA256。想单独拿到 MD5,再用 keytool -exportcert 配合 openssl 一步导出最稳,比在终端里肉眼找字符串靠谱。下面按「先看 alias → 再看指纹 → 单独取 MD5」的顺序来。
一、先搞清楚要查什么
一个 .keystore / .jks 文件里可以放多个密钥对,每个密钥对叫一个 alias(别名)。第三方平台要的「签名指纹」指的是某个 alias 对应证书的指纹,不是整个文件。所以任何命令都得先知道 alias 叫什么。
- SHA1 / SHA256:现在绝大多数平台(Google Play、微信开放平台新版、华为等)要这个。
- MD5:老接口还在要,尤其一些早期 SDK 和旧版微信开放平台;新项目基本不用。
- alias:证书昵称,导出和查指纹都要带它。
二、前置:keytool 在哪
keytool 随 JDK 一起装,在 JDK 的 bin 目录下。如果命令行直接敲 keytool 报「不是内部或外部命令」,要么没装 JDK,要么没把 JDK 的 bin 加进 PATH。
# 直接用完整路径(Windows 示例,按你本机 JDK 版本改)
"C:\Program Files\Java\jdk1.8.0_xxx\bin\keytool.exe" -list -keystore your.keystore
# macOS / Linux 一般装了 JDK 就能直接用
keytool -list -keystore your.keystore
实在找不到,先进 JDK 安装目录的 bin 文件夹,在那里打开命令行再执行。
三、第一步:列出所有 alias
不确定 alias 名时,先列出来(只需要 keystore 密码):
keytool -list -keystore your.keystore
输入 keystore 密码后,会打印类似 your_alias, 2026-03-05, PrivateKeyEntry 这样的行,前面的 your_alias 就是要用的别名。
四、第二步:查看某个 alias 的完整指纹(含 MD5 / SHA1 / SHA256)
加 -v 才会输出指纹,这是最容易漏的一步:
keytool -list -v -keystore your.keystore -alias your_alias
输出里会有三段:
MD5: 12:34:56:78:...
SHA1: AB:CD:EF:...
SHA256: ...
如果只写 keytool -list -keystore your.keystore -alias your_alias(没 -v),终端只回一行 alias 信息,看不到任何指纹——很多人卡在这。
五、单独拿 MD5:keytool 导出 + openssl 解析
想直接拿到一行 MD5,不必在 -v 输出里肉眼找,用导出证书再交给 openssl 最干净:
# 导出该 alias 的证书,再用 openssl 打印 MD5 指纹
keytool -exportcert -alias your_alias -keystore your.keystore -file cert.cer
openssl x509 -in cert.cer -noout -fingerprint -md5
# 一行流式写法(不需要落地 cert.cer 文件)
| | |
| --- | --- |
keytool -exportcert -alias your_alias -keystore your.keystore | openssl x509 -noout -fingerprint -md5
把 -md5 换成 -sha1 或 -sha256 就能拿对应的指纹。注意 keytool 导出的是 DER 格式,openssl x509 默认就能读,不用额外转。
六、两种密码别搞混
Keystore 有两个密码概念,报错常常源于此:
- keystore 密码:打开整个文件用的。
- key(alias)密码:这个 alias 自己的密码,生成时很多人设成和 keystore 密码一样。
上面所有命令默认用 keystore 密码;若 key 密码不同,要补 -keypass 你的key密码。生成时如果两密码设成一样,这里就不用管。
七、六个常见报错对照
| 现象 | 原因 | 处理 |
|---|---|---|
| keytool 不是内部或外部命令 | 没装 JDK 或没配 PATH | 用 JDK/bin 下的完整路径执行;或把 JDK/bin 加入系统 PATH |
| Keystore was tampered with, or password was incorrect | keystore 密码输错,或文件被改动损坏 | 确认密码(区分大小写);确认文件没传坏;老文件可能用的是旧格式 |
| 别名 <x> 不存在 | alias 名写错 | 先跑「第三步」的 -list 看真实 alias,原样复制 |
| java.io.IOException: Invalid keystore format | 文件不是 keystore,或路径指错 | 确认路径下是真正的 .keystore/.jks;别把 .cer 或 p12 当 keystore 传 |
| bash: openssl: command not found | 没装 OpenSSL | Windows 装 Git 自带 openssl;macOS/Linux 一般自带;或用 -v 输出里肉眼取指纹 |
| Android 后台填了 SHA1 仍校验失败 | 填错 alias 的指纹,或用了 debug 签名而非发布签名 | 确认填的是发布 keystore 对应 alias 的指纹;debug 和 release 是两套 |
八、FAQ
Q:jks 和 keystore 有区别吗?
本质是一类东西,都是 Java 的密钥库格式,.jks 是更常见的扩展名。命令完全互通,不用纠结后缀。
Q:MD5 和 SHA1 到底填哪个? 看平台要求。Google Play、新版微信/华为基本要 SHA1 或 SHA256;只有少数老接口还单独要 MD5。不确定就把 SHA1 和 MD5 都准备好,按平台表单填。
Q:怎么确认线上 APK 的签名和我本地 keystore 一致?
用 keytool -printcert -jarfile app-release.apk 直接读 APK 里的证书指纹,和本地 keystore 的 -v 输出对比,一致才说明签名没换。
Q:密码忘了怎么办? keystore 密码没有找回机制,忘了就只能换新的 keystore 重新签名——这也意味着要重新走各平台的签名校验流程,所以密码一定存好。相关流程见站内《Windows 提交 IPA 到 App Store》里的签名与发布部分。
小结
查 Keystore 指纹就三步:-list 看 alias → -list -v 看完整指纹 → 需要单独 MD5 就用 -exportcert 配 openssl 一步导出。记住 -v 是显示指纹的前提,密码分 keystore 和 key 两种,alias 名写错是最常见的低级错误。需要把签名接入发布流程的,回到《Windows 提交 IPA 到 App Store》按步骤走即可。