菜鸟科技网

keystore命令如何使用?

什么是 Keystore 和 Keytool?

  • Keystore (密钥库):一个加密的文件,用于存储私钥、公钥和证书,你可以把它想象成一个数字保险箱,里面存放着你的数字身份和相关的安全凭证。
  • Keytool (密钥工具):用于创建、管理、导入和导出 Keystore 中条目的命令行工具。

常用 Keytool 命令详解

以下是 keytool 最常用的一些命令,配有说明和示例。

keystore命令如何使用?-图1
(图片来源网络,侵删)

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:指定要查看的别名。

示例:

keystore命令如何使用?-图2
(图片来源网络,侵删)
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, DSARSA 是最常用的。
  • -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 文件名。

示例:

keystore命令如何使用?-图3
(图片来源网络,侵删)
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 文件中,添加 signingConfigsbuildTypes 配置。

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 默认会在用户主目录(~/.keystoreC:\Users\<用户名>\.keystore)下查找一个名为 .keystore 的文件。
  • 与 OpenSSL 的区别keytool 使用 Java 自己的密钥库格式(JKS 或 PKCS12)。OpenSSL 是另一个更通用的密码学工具库,两者格式不同,但可以通过工具互相转换。

希望这份详细的指南能帮助你全面掌握 keytool 命令!

分享:
扫描分享到社交APP
上一篇
下一篇