为移动应用签名

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

开发适用于 Android 或 Apple 操作系统的应用时,你最终需要管理签名证书,而如果开发的是 Apple 应用,则还需要管理预配配置文件。 本文介绍如何安全管理这些证书和配置文件,以便能够对应用进行签名和预配。

提示

使用 Microsoft 托管的 Linux、macOS 或 Windows 生成代理,或设置你自己的代理。 请参阅生成和发布代理

本文介绍:

对 Android 应用签名

按照以下步骤为 Android 应用签名,同时确保签名证书安全:

  1. 首先,获取包含签名证书的密钥存储文件。 Android 文档介绍了生成密钥存储文件及其相应密钥的过程。

  2. 基于 Android 或 Xamarin.Android 生成模板创建生成管道。 或者,如果你已有生成管道,请在用于生成 APK 的任务后面添加 Android 签名任务。

  3. 找到 Android 签名任务的“为 APK 签名”复选框并启用它。

  4. 在“密钥存储文件”字段旁边,选择设置图标并将密钥存储文件上传到安全文件库。 在上传期间,密钥存储将会加密并以安全方式存储。

  5. 将密钥存储上传到安全文件库后,在“密钥存储文件”下拉列表中选择该密钥存储。

  6. 转到“变量”选项卡并添加以下变量。 在“值”列中,输入你的密钥存储密码、密钥别名和密钥密码。

    • keystore-password:未加密的密钥存储文件的密码。 请务必选择锁形图标。 这样就会保护你的密码并在日志中对其进行模糊处理。

    • key-alias:生成的签名证书的密钥别名。

    • key-password:与指定别名关联的密钥的密码。 同样,请务必选择锁形图标

      Android 签名变量

  7. 返回“任务”选项卡,在签名选项中引用新建变量的名称。

    Android 签名输入值

保存生成管道,准备工作现已完成! 任何生成代理现在都可以安全地为你的应用签名,而无需在生成计算机本身上进行任何证书管理。

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

Xcode 或 Xamarin.iOS 生成需要访问 P12 签名证书以及一个或多个预配配置文件,才能对应用进行签名和预配。 以下部分介绍如何获取这些文件。

获取 P12 签名证书

创建开发或分发签名证书后,使用 Xcode 或使用 macOS 上的 Keychain Access 应用将此证书导出到 .p12 文件。

  1. 若要使用 Xcode 8 或更低版本进行导出,请转到“Xcode”>“首选项...”>“帐户”,并选择你的 Apple 开发人员帐户。

  2. 选择“查看详细信息...”,右键单击要导出的签名标识,然后选择“导出...”。

  3. 输入文件名和密码。 请记下该密码,因为稍后需要用到。

    Xcode 导出证书

  4. 也可以在 macOS 上使用 Keychain Access 应用按照类似的过程进行操作,或者在 Windows 上生成签名证书。 如果你偏好此方法,请使用此文中所述的过程。

获取预配配置文件

除非你的应用使用自动签名,否则你可以从 Apple 开发人员门户下载应用预配配置文件。 了解如何在 Apple 开发人员门户中下载预配配置文件。

还可以使用 Xcode 来访问 Mac 上安装的预配配置文件。

  1. 使用 Xcode 8 或更低版本时,请转到“Xcode”>“首选项...”>“帐户”,并选择你的 Apple 开发人员帐户。

  2. 右键单击要使用的预配配置文件,然后选择“在 Finder 中显示”。

  3. 将突出显示的文件从 Finder 复制到另一个位置,并为其指定一个描述性文件名。

    Xcode 的“在 Finder 中显示”

配置生成

生成提供两种建议的方法来访问用于对应用进行签名和预配的签名证书和预配配置文件:

  1. 在生成期间安装这些证书和配置文件
  2. 在 macOS 生成代理上预先安装这些证书和配置文件

选择以下任一选项卡以了解详细信息。

无法持久访问生成代理(例如托管的 macOS 代理)时,请使用此方法。 在生成开始时会安装 P12 证书和预配配置文件,在生成完成时会将其删除。

在生成期间安装 P12 证书

视觉编辑器
  1. 在生成中的 Xcode 或 Xamarin.iOS 任务前面添加安装 Apple 证书任务。
  2. 在“证书(P12)”字段旁边,选择设置图标并将你的 P12 文件上传到安全文件库。 在上传期间,证书将会加密并以安全方式存储。
  3. 将证书上传到安全文件库后,在“证书(P12)”下拉列表中选择该证书。
  4. 转到“变量”选项卡,添加名为 P12password 的变量。 将其值设置为证书的密码。 请务必选择锁形图标。 这样就会保护你的密码并在日志中对其进行模糊处理。
  5. 返回“任务”选项卡。在“安装 Apple 证书”任务的设置中,如下所示在“证书(P12)密码”字段中引用新建的变量:$(P12password)
示例 YAML
  1. 将 P12 文件上传到安全文件库。 在上传期间,证书将会加密并以安全方式存储。

  2. 转到“变量”选项卡,添加名为 P12password 的变量。 将其值设置为证书的密码。 请务必选择锁形图标。 这样就会保护你的密码并在日志中对其进行模糊处理。

  3. 在 YAML 中的 Xcode 或 Xamarin.iOS 任务前面添加安装 Apple 证书任务:

    - task: InstallAppleCertificate@2
        inputs:
          certSecureFile: 'my-secure-file.p12' # replace my-secure-file.p12 with the name of your P12 file.
          certPwd: '$(P12password)'
    

在生成期间安装预配配置文件

视觉编辑器
  1. 在生成中的 Xcode 或 Xamarin.iOS 任务前面添加安装 Apple 预配配置文件任务。
  2. 对于“预配配置文件位置”选项,请选择“安全文件”(在 YAML 中为 secureFiles)。
  3. 在“预配配置文件”字段旁边,选择设置图标并将预配配置文件上传到安全文件库。 在上传期间,证书将会加密并以安全方式存储。
  4. 将证书上传到安全文件库后,在“预配配置文件”下拉列表中选择该证书。
  5. 启用标有“生成后删除配置文件”的复选框。 这可以确保该预配配置文件不会遗留在代理计算机上。
示例 YAML
  1. 将预配配置文件上传到安全文件库。 在上传期间,证书将会加密并以安全方式存储。

  2. 在 YAML 中的 Xcode 或 Xamarin.iOS 任务前面添加安装 Apple 预配配置文件任务:

    - task: InstallAppleProvisioningProfile@1
        inputs:
          provProfileSecureFile: 'my-provisioning-profile.mobileprovision' # replace my-provisioning-profile.mobileprovision with the name of your provisioning profile file.
    

    [注意]“生成后删除配置文件”默认设置为 true。

在 Xcode 任务中引用文件

视觉编辑器
  1. 选择“Xcode”任务。
  2. 对于“签名样式”选项,请选择“手动签名”。
  3. 在“签名标识”字段中,输入 $(APPLE_CERTIFICATE_SIGNING_IDENTITY)。 此变量是“安装 Apple 证书”任务为所选证书自动设置的。
  4. 在“预配配置文件 UUID”字段中,输入 $(APPLE_PROV_PROFILE_UUID)。 此变量是“安装 Apple 预配配置文件”任务为所选预配配置文件自动设置的。
示例 YAML
- task: Xcode@5
  inputs:
    signingOption: 'manual'
    signingIdentity: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)'
    provisioningProfileUuid: '$(APPLE_PROV_PROFILE_UUID)'

在 Xamarin.iOS 任务中引用文件

视觉编辑器
  1. 选择“Xamarin.iOS”任务。
  2. 对于“替代方式”选项,请选择“标识符”。
  3. 在“签名标识”字段中,输入 $(APPLE_CERTIFICATE_SIGNING_IDENTITY)。 此变量是“安装 Apple 证书”任务为所选证书自动设置的。
  4. 在“预配配置文件 UUID”字段中,输入 $(APPLE_PROV_PROFILE_UUID)。 此变量是“安装 Apple 预配配置文件”任务为所选预配配置文件自动设置的。
示例 YAML
- task: XamariniOS@2
    inputs:
      solutionFile: '**/*.iOS.csproj'
      signingIdentity: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)'
      signingProvisioningProfileID: '$(APPLE_PROV_PROFILE_UUID)'

保存生成管道,准备工作现已完成! 现在,生成代理可以安全地对你的应用进行签名和预配。

常见问题解答

需要使用代理吗?

至少需要一个代理才能运行生成或发布。

我遇到了问题。 如何对其进行故障排除?

请查看排查生成和发布问题

我无法选择默认代理池,无法将生成或发布排队。 如何修复此问题?

请查看代理池

我的 NuGet 推送任务失败,出现“错误: 无法获取本地颁发者证书”错误。 如何解决此问题?

可通过添加受信任的根证书来解决此问题。 可将环境变量 NODE_EXTRA_CA_CERTS=file 添加到生成代理,也可在管道中添加任务变量 NODE.EXTRA.CA.CERTS=file。 有关此变量的更多详细信息,请参阅 Node.js 文档。 有关在管道中设置变量的说明,请参阅在管道中设置变量

我在本地使用 TFS,但没有看到其中某些功能。 为什么看不到?

其中某些功能仅在 Azure Pipelines 上可用,在本地尚不可用。 如果你已升级到最新版本的 TFS,则可在本地使用这些功能。