如何将x509.pem pk8文件导入jks-keystore?

Fan*_*ang 11 keystore jks

我已经尝试过使用该命令

keytool -import -keystore *.jks -alias alias_name -keypass alias_passwd -file *.x509.pem` (no *.pk8 file)
Run Code Online (Sandbox Code Playgroud)

但是当我使用jks签署APK时,a

trusted certificate entries are not password-protected
Run Code Online (Sandbox Code Playgroud)

发生错误.

Fan*_*ang 15

openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out platform.priv.pem -nocrypt

openssl pkcs12 -export -in platform.x509.pem -inkey platform.priv.pem -out platform.pk12 -name android

keytool -importkeystore -destkeystore platform.jks -srckeystore platform.pk12 -srcstoretype PKCS12 -srcstorepass android -alias android
Run Code Online (Sandbox Code Playgroud)

  • 在 linux 中还有一个可用于执行此操作的 shell 脚本:https://github.com/getfatday/keytool-importkeypair/blob/master/keytool-importkeypair (2认同)

小智 12

方的回答是正确的,但缺乏解释。我必须弄清楚一些事情才能理解它,虽然我不能 100% 确定我从我的经验中得到的一切,但我很确定它可以帮助人们,所以就在这里。

事先,请确保您已安装 openssl 和 keytool 并将其添加到您的 PATH 中,否则这些命令当然将不起作用。

openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out platform.priv.pem -nocrypt
Run Code Online (Sandbox Code Playgroud)

这将从您的 pk8 文件生成一个文件“platform.priv.pem”。

openssl pkcs12 -export -in platform.x509.pem -inkey platform.priv.pem -out platform.pk12 -name {{KEY_ALIAS}}
Run Code Online (Sandbox Code Playgroud)

这将使用“platform.x509.pem”文件和之前生成的“platform.priv.pem”生成“platform.pk12”文件。键别名是您提供的字符串值,它可以是您想要的任何内容,但您需要记住它。

输入此命令后,系统将提示您输入密码(以及密码确认)。您将自己定义该密码。这将是您的“关键密码”,当然,您也需要记住它。

keytool -importkeystore -destkeystore {{STORE_FILE_NAME}}.jks -srckeystore platform.pk12 -srcstoretype PKCS12 -srcstorepass {{KEY_PASSWORD}} -alias {{KEY_ALIAS}}
Run Code Online (Sandbox Code Playgroud)

最终命令实际上会执行以下两件事之一:

  • 如果指定的 jks 文件已存在,它将导入(或覆盖(如果存在))具有给定别名的密钥
  • 如果该文件尚不存在,它将创建一个全新的 jks 文件,并使用给定的别名导入您的密钥
    。无论如何,该命令会采用先前定义的密钥密码和密钥别名。

输入命令后,系统将提示您输入商店密码。如果它是一个已经存在的JKS文件,您将必须提供已经存在的 JKS 存储密码。

否则,它是JKS您定义的新密码。记住你赋予它的价值。

最终,您定义了 4 个值:

  1. 键别名
  2. 密钥密码
  3. 存储密码
  4. 存储文件名

这正是 Android 项目的 Gradle 文件对 APK 进行签名所需的内容

文件:[Android项目根目录]/app/build.graddle

[...]
android {
    [...]
    signingConfigs {
        release {
            storeFile file("{{STORE_FILE_PATH*}}/{{STORE_FILE_NAME}}.jks")
            storePassword "{{STORE_PASSWORD}}"
            keyAlias "{{KEY_ALIAS}}"
            keyPassword "{{KEY_PASSWORD}}"
        }
    }
    [...]
}
[...]
Run Code Online (Sandbox Code Playgroud)

* :该JKS文件可能应该放置在您的项目中,以便进行版本控制,同时也为了简单起见。提供 build.gradle 位置的相对路径。