Github Action中安全配置安卓证书签名

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

Views: 65
0 0
Read Time:1 Minute, 21 Second

在开发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中实现安全配置以对安卓应用进行签名的全部内容。总结起来就是以下几点:

  • KeyStore、Key信息不能明文写入build.gradle,应写入local.properties文件中
  • KeyStore、Key信息以Github Secrets形式配置为环境变量,在Action中读取
  • Key文件内容通过base64进行编码,确保非明文形式存储

感兴趣的朋友可以参考我的项目VcServer中的配置。

Happy
Happy
0 %
Sad
Sad
0 %
Excited
Excited
0 %
Sleepy
Sleepy
0 %
Angry
Angry
0 %
Surprise
Surprise
0 %
FranzKafka95
FranzKafka95

极客,文学爱好者。如果你也喜欢我,那你大可不必害羞。

Articles: 99

Leave a Reply

Your email address will not be published. Required fields are marked *

en_USEN