Physical Address:
ChongQing,China.
WebSite:

如何在Github Action中配置证书签名的安全实践

在开发VcServer的过程中,遇到一个比较实际的问题是:我希望在Github仓库中发布Release版本时实现应用签名。
在我的工程项目中,我原本是将KeyStore以及签名Key相关信息都放在build.gradle.kts文件中,通过signingConfigs配置字段进行配置。这部分配置信息原本都是明文的,该文件也会被Git记录从而上传到Github中。
在前期开发阶段,仓库本身是被设置为私有状态,这样开发也没什么大问题。但是如果需要将仓库公开,同时保护我们的签名信息,这样设置就会存在极大的安全风险。
比较合理的方式是将KeyStore、Key相关信息放入local.properties文件中,该文件通常是不会被Git记录的,在build.gradle中我们从local.properties文件中获取KeyStore与Key相关信息。
证书部分的配置如下所示,我们在build.gradle中通过signingConfigs配置字段进行配置:
signingConfigs {
release {
//从 local.properties 读取(用于本地开发)
def keystorePropertiesFile = rootProject.file("local.properties")
def keystoreProperties = new Properties()
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
// 环境变量优先级高于 local.properties
def keystoreFilePath = System.getenv("RELEASE_STORE_FILE") ?: keystoreProperties['RELEASE_STORE_FILE'] ?: 'app/jks/release'
def keystorePassword = System.getenv("RELEASE_STORE_PASSWORD") ?: keystoreProperties['RELEASE_STORE_PASSWORD'] ?: ''
def keyAliasName = System.getenv("RELEASE_KEY_ALIAS") ?: keystoreProperties['RELEASE_KEY_ALIAS'] ?: ''
def keyPasswordValue = System.getenv("RELEASE_KEY_PASSWORD") ?: keystoreProperties['RELEASE_KEY_PASSWORD'] ?: ''
// 检查 keystore 文件是否存在,如果不存在则跳过签名配置(用于 CI/CD 中的 debug 构建)
// 使用 rootProject.file() 确保路径相对于项目根目录,而不是 app 目录
def keystoreFile = rootProject.file(keystoreFilePath)
if (keystoreFile.exists() && keystorePassword && keyAliasName && keyPasswordValue) {
storeFile keystoreFile
storePassword keystorePassword
keyAlias keyAliasName
keyPassword keyPasswordValue
} else {
// 如果文件不存在或缺少配置,使用空配置(Gradle 会跳过签名验证)
// 这允许在没有 keystore 的情况下构建(例如 debug 构建)
}
}
}
以上配置可以确保在本地顺利编译且不会透露签名证书相关信息。但重要的是,如何在Github Action中完成Release版本的编译。眼尖的读者应该发现,build.gradle中配置时有读取系统环境变量,所以我们还需要从环境变量中获取上述信息,并确保环境变量的优先级高于本地文件中读取的信息内容。在本地开发时,我们没有添加环境变量,这部分信息由本地local.properties文件提供,在Github发布Release时,则需要从环境变量中进行读取。
所以这里我们需要将签名相关信息如KeyStore、Key等配置到环境变量内。为了达成这一目标,我们需要通过Github Secrets 来实现,Github Secrets不会在Github Action中进行打印,且对外部不可见。
首先,我们进入我们在Github中所托管的仓库,点击settings->Secrets and variables->Actions->Repository secrets,如下所示:

这里我们添加了四个secrets,分别是RELEASE_KEYSOTRE_BASE64、RELEASE_SOTRE_PASSWORD、RELEASE_KEY_ALIAS、RELEASE_KEY_PASSWORD,分别对应Key文件、KeyStore密码、Key别名以及Key密码,其中Key文件内容是我们将我们本地的Key进行base64编码后生成的内容,在使用时我们需要将其还原为对应路径下的Key文件。
其次,在Github Action的配置文件中,我们需要将secrets中的上述内容设置为环境变量,如下所示:
- name: Setup Keystore
if: github.event.inputs.release_tag != ''
env:
KEYSTORE_BASE64: ${{ secrets.RELEASE_KEYSTORE_BASE64 }}
KEYSTORE_PASSWORD: ${{ secrets.RELEASE_STORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.RELEASE_KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.RELEASE_KEY_PASSWORD }}
run:
.....
以上就是如何在Github Action中实现安全配置以对安卓应用进行签名的全部内容。总结起来就是以下几点:
感兴趣的朋友可以参考我的项目VcServer中的配置。