移动应用签名

Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022 |Azure DevOps Server 2020

本文介绍了 Azure Pipelines 如何安全地管理证书和配置文件,以便对移动应用进行签名和预配。 若要对移动应用进行签名和预配,管道必须为 Android 或 Apple 操作系统提供签名证书,以及为 Apple 提供预配置文件。

Android 应用签名

以下过程在确保签名证书安全的同时对 Android 应用进行签名。

获取密钥存储文件

按照 Android 文档 生成密钥存储文件及其相应的密钥。 密钥存储文件包含签名证书。

在 Azure Pipelines >安全文件中,选择 “+ 安全”文件 并将密钥存储文件上传到 安全文件库。 上传期间,密钥存储经过加密并安全地存储。

将签名任务添加到管道中

在 Android 应用的 YAML 管道中,设置以下keystore-passwordkey-aliaskey-password变量。 或者,可以使用管道 变量 UI 设置变量。

variables:
  keystore-password: <keystore file password>
  key-alias: <key alias for the signing certificater>
  key-password: <password for the key associated with the alias>

在生成步骤后将 AndroidSigning@3 任务添加到管道。 在 AndroidSigning@3 任务中:

  • <apkFiles> 是签名 APK 文件所需路径和名称。 默认值为 **/*.apk
  • <apksign> 必须是 true(默认值)。
  • <apksignerKeystoreFile> 是安全文件库中上传的密钥存储文件的名称。
  • <apksignerKeystorePassword> 是未加密密钥存储文件的密码。
  • <apksignerKeystoreAlias> 是签名证书的密钥别名。
  • <apksignerKeyPassword> 是与指定别名关联的密钥的密码。
steps:
- task: AndroidSigning@3
  displayName: 'Signing and aligning APK file(s) **/*.apk'
  inputs:
    apkFiles: '**/*.apk'
    apksign: true
    apksignerKeystoreFile: <keystore-filename.keystore>
    apksignerKeystorePassword: $(keystore-password)
    apksignerKeystoreAlias: $(key-alias)
    apksignerKeyPassword: $(key-password)

现在,任何生成代理都可以安全地对应用进行签名,而无需在生成计算机上进行任何证书管理。

Apple iOS、macOS、tvOS 或 watchOS 应用签名

若要对 Apple 应用进行签名和预配,Xcode 版本需要访问 P12 签名证书和一个或多个预配配置文件。

获取 P12 签名证书

使用 Xcode 或使用 macOS 上的 Keychain Access 应用将开发或分发签名证书导出到 .p12 文件。 要使用 Xcode 导出,请执行以下操作:

  1. 转到 Xcode>首选项>帐户

  2. 在左列中,选择 Apple ID。

  3. 在右侧,选择你的个人或团队帐户,然后选择管理证书

  4. Ctrl+选择要导出的证书,然后从菜单中选择 “导出证书 ”。

    使用 Xcode 导出证书的屏幕截图。

  5. 输入证书名称、保存文件的位置以及用于保护证书的密码。

若要使用 macOS 上的 Keychain Access 应用导出或在 Windows 上生成签名证书,请使用 iOS 签名中所述的过程。

上传 P12 文件并添加密码变量

在 Azure Pipelines >安全文件中,选择 “+ 安全文件 ”并将 P12 文件上传到 Azure Pipelines 安全文件库。 上传期间,证书经过加密并安全地存储。

在应用的生成管道的 “变量 ”UI 中,添加一个名为 P12password 的变量,并将证书密码作为值。 选择 锁定 图标来保护密码并在日志中隐藏密码。

获取预配配置文件

如果应用不使用自动签名,请从 Apple 开发人员门户下载应用预配配置文件。 有关更多信息,请参阅编辑、下载或删除预配配置文件

你还可以使用 Xcode 来访问 Mac 上安装的预配配置文件。 在 Xcode 中,转到Xcode>首选项>帐户。 选择 Apple ID 和团队,然后选择“ 下载手动配置文件”。

在 Azure Pipelines 中,将预配配置文件上传到 安全文件库。 上传期间,文件经过加密并安全地存储。

将签名和预配任务添加到管道

至少需要一台代理计算机才能运行 Azure Pipelines 生成或发布管道。 可以使用 Microsoft托管代理 或设置 自承载代理。 有关详细信息,请参阅 Azure Pipelines 代理

对于托管 macOS 代理上的 Apple 应用签名和预配,或者如果不想允许访问代理钥匙串,可以在每次构建期间安装所需的证书和配置文件。 如果使用自承载代理并信任可以访问代理密钥链的人员和进程,则可以在 macOS 生成代理上预安装证书和配置文件。

在每个生成过程中安装证书和配置文件

如果您无法长期访问构建代理,例如,使用 Microsoft 托管的代理时,您可以在每次构建期间安装证书和配置文件。 管道在每次构建开始时安装P12证书和预置配置文件,并在构建完成后将其删除。

在应用的 YAML 生成管道中,在 Xcode@5 任务之前添加 InstallAppleCertificate@2 任务。 在代码中,将 <secure-file.p12> 替换为上传的 .p12 文件的名称。 对于 certPwd,请使用创建的安全 P12password 变量。

- task: InstallAppleCertificate@2
    inputs:
      certSecureFile: '<secure-file.p12>'
      certPwd: '$(<P12password>)'

此外,在Xcode@5任务之前将InstallAppleProvisioningProfile@1任务添加到管道。 将 <secure-file.mobileprovision> 替换为预配配置文件的名称。

- task: InstallAppleProvisioningProfile@1
    inputs:
      provProfileSecureFile: '<secure-file.mobileprovision>'

注意

InstallAppleCertificate@2InstallAppleProvisioningProfile@1任务中,removeProfile参数默认为true,这会在每次生成后删除证书和配置文件。

现在,任何生成代理都可以安全地对应用进行签名,而无需在生成计算机本身上进行任何证书或配置文件管理。

在 macOS 生成代理上预装证书和配置文件

或者,可以在 自承载 macOS 构建代理上预安装签名证书和预配配置文件,以供持续使用。 仅当信任有权访问代理计算机上的 macOS 密钥链的人员和进程时,才使用此方法。

将密钥链密码变量添加到管道

向名为 KEYCHAIN_PWD的生成管道添加新变量。 将值设置为默认 macOS 密钥链密码,通常是启动代理的用户的密码。 选择 锁定 图标来保护此密码。

在代理上安装 P12 证书

若要在默认密钥链中安装 P12 证书,请在代理计算机上的 macOS 终端窗口中运行以下命令。 将<certificate.p12>替换为P12文件路径和名称,并将<password>替换为P12文件的加密密码。

sudo security import <certificate.p12> -P <password>

在代理上安装预配配置文件

通过在 macOS 终端窗口中输入 security find-identity -v -p codesigning 来查找签名标识的全名。 你将看到 iPhone Developer/Distribution: Developer Name (ID) 形式的签名标识列表。 如果标识无效,该标识后面会显示类似于 (CSSMERR_TP_CERT_REVOKED) 的内容。

若要在代理上安装预配配置文件,请从 macOS 终端窗口中运行以下命令。 将 <profile> 替换为预配文件的路径。 将 <UUID> 替换为配置描述文件的 UUID,即去掉 .mobileprovision 扩展名后的配置描述文件文件名。

sudo cp <profile> ~/Library/MobileDevice/Provisioning Profiles/<UUID>.mobileprovision

添加使用默认密钥链的签名和预配任务

在 YAML 生成管道中,在 Xcode@5 任务之前添加 InstallAppleCertificate@2 任务。 在此代码中,设置以下值:

  • certSecureFile:上传的 .p12 文件的名称。
  • certPwd:安全 P12password 的变量。
  • signingIdentity:签名标识的全名。
  • keychaindefault 允许访问默认密钥链。
  • keychainPasswordKEYCHAIN_PWD 变量。
  • deleteCertfalse 在构建之间保留证书。
- task: InstallAppleCertificate@2
  inputs:
    certSecureFile: '<secure-file.p12>'
    certPwd: '$(P12password)'
    signingIdentity: <full-signing-identity>
    keychain: default
    keychainPassword: `$(KEYCHAIN_PWD)
    deleteCert: false

此外,在 Xcode@5 任务之前添加 InstallAppleProvisioningProfile@1 任务。 在代码中:

  • 请将 provProfileSecureFile 设置为预置配置文件的名称。
  • removeProfile设置为false以在构建之间保留配置文件。
- task: InstallAppleProvisioningProfile@1
    inputs:
      provProfileSecureFile: '<secure-file.mobileprovision>'
      removeProfile: false

macOS 构建代理现在可以安全地为所有构建签名和配置应用程序,而无需进一步的证书或配置文件管理。

配置 Xcode 生成任务以引用安全文件

Xcode 生成(Xcode@5)任务通过使用变量引用signingIdentityprovisioningProfileUuid。 上述 “安装 Apple 证书 ”和 “安装 Apple 预配配置文件 ”任务会自动为所选证书和预配配置文件设置这些变量。

将以下代码添加到管道 Xcode 生成(Xcode@5) 任务:

- task: Xcode@5
  inputs:
    signingOption: 'manual'
    signingIdentity: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)'
    provisioningProfileUuid: '$(APPLE_PROV_PROFILE_UUID)'

管道生成代理现在安全地对应用进行签名和预配,而无需在生成计算机或生成管道中进一步进行证书或配置文件管理。