什么是 Keystore 和 Keytool?
- Keystore (密钥库):一个加密的文件,用于存储私钥、公钥和证书,你可以把它想象成一个数字保险箱,里面存放着你的数字身份和相关的安全凭证。
- Keytool (密钥工具):用于创建、管理、导入和导出 Keystore 中条目的命令行工具。
常用 Keytool 命令详解
以下是 keytool 最常用的一些命令,配有说明和示例。

A. 查看和列出信息
列出 Keystore 中的所有条目
显示密钥库中所有密钥的别名(alias)、创建日期、类型等。
keytool -list -v -keystore <keystore文件路径> -storepass <密钥库密码>
-list:表示列出内容。-v:显示详细信息(verbose mode)。-keystore:指定密钥库文件路径,如果未指定,默认是~/.keystore(用户主目录下)。-storepass:指定密钥库的访问密码。
示例:
# 列出默认位置的 .keystore 文件中的所有内容 keytool -list -v -storepass changeit # 列出指定路径 my-release-key.keystore 的内容 keytool -list -v -keystore my-release-key.keystore -storepass mypassword
查看特定条目的详细信息
查看某个别名的公钥证书信息。
keytool -printcert -alias <别名> -keystore <keystore文件路径> -storepass <密钥库密码>
-printcert:打印证书信息。-alias:指定要查看的别名。
示例:

keytool -printcert -alias myalias -keystore my-release-key.keystore -storepass mypassword
B. 创建和生成
创建一个新的 Keystore 文件
如果指定的密钥库文件不存在,此命令会创建一个新的。
keytool -genkeypair -alias <别名> -keyalg <算法> -keystore <keystore文件路径> -storepass <密钥库密码> -keypass <私钥密码> -validity <有效期天数> -dname "CN=姓名, OU=部门, O=公司, L=城市, ST=省份, C=国家"
-genkeypair:生成一个密钥对(公钥和私钥)。-keyalg:密钥算法,常用RSA,EC,DSA。RSA是最常用的。-keypass:私钥的密码,如果与-storepass相同,可以省略,系统会提示。-validity:证书的有效期(天数),默认为90天。-dname:所有者信息(Distinguished Name),这是证书的核心信息。CN(Common Name) 通常是域名或你的姓名。
示例: 为 Android 应用创建一个发布密钥库
keytool -genkeypair -v \ -alias myandroidkey \ -keyalg RSA \ -keysize 2048 \ -keystore my-android-key.keystore \ -storepass mypassword \ -keypass mypassword \ -validity 10000 \ -dname "CN=MyAndroidApp, OU=MyTeam, O=MyCompany, L=Beijing, ST=Beijing, C=CN"
创建自签名证书(CSR)
有时你需要一个证书签名请求文件来向受信任的证书颁发机构(CA,如 Let's Encrypt, DigiCert)申请证书。
keytool -certreq -alias <别名> -keystore <keystore文件路径> -storepass <密钥库密码> -file <输出CSR文件路径>
-certreq:生成证书签名请求。-file:指定输出的 CSR 文件名。
示例:

keytool -certreq -alias myandroidkey -keystore my-android-key.keystore -storepass mypassword -file myapp.csr
C. 导入和导出
导入 CA 签发的证书
当你从 CA 获得证书后(通常是 .cer 或 .crt 文件),需要将其导入到你的 Keystore 中。
keytool -importcert -alias <别名> -file <证书文件路径> -keystore <keystore文件路径> -storepass <密钥库密码>
-importcert:导入证书。-alias:指定要关联的别名(通常是生成 CSR 时使用的别名)。-file:要导入的证书文件。
示例:
keytool -importcert -alias myandroidkey -file myapp-signed.cer -keystore my-android-key.keystore -storepass mypassword
导出证书
将 Keystore 中的某个条目的证书导出为单独的文件(如 .cer)。
keytool -exportcert -alias <别名> -keystore <keystore文件路径> -storepass <密钥库密码> -file <输出证书文件路径>
-exportcert:导出证书。
示例:
keytool -exportcert -alias myandroidkey -keystore my-android-key.keystore -storepass mypassword -file myapp-public.cer
D. 修改和删除
删除一个条目
从 Keystore 中删除指定的别名。
keytool -delete -alias <别名> -keystore <keystore文件路径> -storepass <密钥库密码>
-delete:删除条目。
示例:
keytool -delete -alias oldalias -keystore my-android-key.keystore -storepass mypassword
更改密钥库或私钥密码
# 更改密钥库密码 keytool -storepasswd -keystore <keystore文件路径> # 系统会提示输入旧密码,然后输入两次新密码 # 更改私钥密码 keytool -keypasswd -alias <别名> -keystore <keystore文件路径> # 系统会提示输入密钥库密码,然后输入旧私钥密码,最后输入两次新私钥密码
实战场景:Android 应用签名
这是 keytool 最常见的用途之一。
步骤 1:生成一个用于签名的 Keystore 如果你还没有,就按照上面的 "B.1 创建一个新的 Keystore 文件" 步骤生成一个。
步骤 2:在 build.gradle 中配置签名信息
在 Android 项目的 app/build.gradle 文件中,添加 signingConfigs 和 buildTypes 配置。
android {
...
signingConfigs {
release {
// Keystore 在项目根目录下
storeFile file('my-android-key.keystore')
storePassword 'mypassword' // Keystore 密码
keyAlias 'myandroidkey' // 别名
keyPassword 'mypassword' // 私钥密码
}
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
// 应用签名配置
signingConfig signingConfigs.release
}
}
}
步骤 3:构建 Release 版本 APK
当你执行 ./gradlew assembleRelease 命令时,Gradle 会自动使用你配置的 Keystore 来签名生成的 APK 文件。
注意事项
- 密码安全:不要将密码硬编码在代码或版本控制系统中,对于生产环境,考虑使用环境变量或 Gradle 的
properties文件(并加入.gitignore)。 - 备份:务必妥善保管你的 Keystore 文件和对应的密码! Keystore 丢失或密码忘记,你将无法再对应用进行更新,也无法使用推送通知等依赖证书的服务。
- 默认位置:
keytool默认会在用户主目录(~/.keystore或C:\Users\<用户名>\.keystore)下查找一个名为.keystore的文件。 - 与 OpenSSL 的区别:
keytool使用 Java 自己的密钥库格式(JKS 或 PKCS12)。OpenSSL是另一个更通用的密码学工具库,两者格式不同,但可以通过工具互相转换。
希望这份详细的指南能帮助你全面掌握 keytool 命令!
