如何在不使用 github 中的秘密的情况下安全地签署 Android apk?

Posted

技术标签:

【中文标题】如何在不使用 github 中的秘密的情况下安全地签署 Android apk?【英文标题】:How to sign an Android apk securely without using secrets in github? 【发布时间】:2020-10-15 14:03:02 【问题描述】:

https://overflow.buffer.com/2020/05/07/using-github-actions-for-android-continuous-integration-and-delivery/

我阅读并遵循此处的指南并设法设置 Github Action 以生成签名的 apk。是否可以在不使用 Github 中的秘密的情况下签署 Android apk?如果可能的话,我想将密钥库 jks 和其他详细信息(例如别名)存储到单独的云服务器,比如 Google 驱动器。我能否检索密钥库和详细信息并以某种方式将它们导入 Github CI 脚本?我试图实现的最终目标是找到最安全的方式来签署 apk,我仍在寻找解决方案。

【问题讨论】:

【参考方案1】:

如果您不想使用 GitHub 机密,可以将签名信息(密码和别名)提取到单独的文件中,如 here 所述。

(所有示例均来自以上链接)

使用此内容创建文件keystore.properties

storePassword=myStorePassword
keyPassword=mykeyPassword
keyAlias=myKeyAlias
storeFile=myStoreFileLocation

在你的 gradle 脚本中读取文件的内容:

...

// Create a variable called keystorePropertiesFile, and initialize it to your
// keystore.properties file, in the rootProject folder.
def keystorePropertiesFile = rootProject.file("keystore.properties")

// Initialize a new Properties() object called keystoreProperties.
def keystoreProperties = new Properties()

// Load your keystore.properties file into the keystoreProperties object.
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

android 
    ...

设置签名配置:

android 
    signingConfigs 
        config 
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        
    
    ...
  

在您的 CI 工作中,您必须以某种方式下载密钥库并提取签名信息。例如使用curl

尽管如此,这仍然没有增加安全性。如果您要公开托管您的密钥库和签名信息,那么每个人都可以下载它。如果您只使用密码/API 密钥访问它,则必须将此密码/API 密钥提供给您的 CI。最好通过 GitHub 机密。

我不知道您的用例,但一般来说,我建议您使用 GitHub 机密(或任何其他机密功能,如果您使用不同的 CI)。

【讨论】:

感谢您的推荐。我知道这种方法,它不会像你提到的那样增加安全性。我想 GitHub 的秘密是要走的路。

以上是关于如何在不使用 github 中的秘密的情况下安全地签署 Android apk?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 %s 的情况下安全、动态地在查询中设置列名?

在不泄露来源的情况下比较秘密数据

在没有秘密的情况下解码 JWT 令牌

如何在不使用环境参数的情况下解决 GitHub 操作中的文件

如何在不使用dotnet中的安全令牌(使用soap api)的情况下登录salesforce?

在不关闭底层流的情况下安全地使用带有 HttpContent.ReadAsStreamAsync() 的 StreamReader