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

Posted

技术标签:

【中文标题】如何将 x509.pem pk8 文件导入 jks-keystore?【英文标题】:How to import x509.pem pk8 file into jks-keystore? 【发布时间】:2017-02-01 03:20:49 【问题描述】:

我已经尝试过使用命令

keytool -import -keystore *.jks -alias alias_name -keypass alias_passwd -file *.x509.pem` (no *.pk8 file)

但是当我使用 jks 对 APK 进行签名时,一个

trusted certificate entries are not password-protected

发生错误。

【问题讨论】:

【参考方案1】:
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

【讨论】:

在 linux 中还有一个可用的 shell 脚本:github.com/getfatday/keytool-importkeypair/blob/master/…【参考方案2】:

鉴于 keytool-importkeypair 仅适用于已存在的密钥库,您可以使用此脚本的其他版本,该脚本将通过在新的密钥库

这里是脚本platform_import_keystore

【讨论】:

感谢这实际上是一个重要的功能。【参考方案3】:

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

在此之前,请确保您已安装 openssl 和 keytool 并将其添加到您的 PATH 中,否则这些命令将无法正常工作。

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

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

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

这将使用您的“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

最后的命令实际上会做两件事之一:

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

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

否则,就是一个新的JKS你定义了一个新的密码。记住你给它的价值。

在一天结束时,您已经定义了 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"
        
    
    [...]

[...]

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

希望这会有所帮助!

【讨论】:

我收到 keytool 错误:java.lang.Exception: Alias 在第三步后不存在 感谢您的解释。 在签名 apk 时遇到错误 Algorithm HmacPBESHA256 not available,此时“*jks”是由 keytool 生成的,而不是来自 AOSP。

以上是关于如何将 x509.pem pk8 文件导入 jks-keystore?的主要内容,如果未能解决你的问题,请参考以下文章

签名证书keystore,jks,pk8,x509.pem

签名证书keystore,jks,pk8,x509.pem

jks生成

jks生成

Android 根据源码文件生成.jks的系统签名

Android : apk系统签名的多种方法