对移动应用进行签名

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

若要为 Android 或 Apple 操作系统对移动应用进行签名和预配,你需要管理签名证书和 Apple 预配配置文件。 本文介绍如何安全地管理证书和配置文件,以便在 Azure Pipelines 中对应用进行签名和预配。

注意

至少需要一个代理才能运行生成或发布。 你可以使用 Microsoft 托管的 Linux、macOS 或 Windows 生成代理,或设置你自己的代理。 有关详细信息,请参阅生成和发布代理

对 Android 应用签名

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

上传密钥存储文件

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

  2. 在 Azure Pipelines 中,转到>安全文件。 选择 + 安全文件并将密钥存储文件上传到安全文件库。 在上传期间,密钥存储会被加密并以安全方式存储。

将签名任务添加到管道中

在执行生成应用的步骤后,将 AndroidSigning@3 任务添加到 YAML 管道中。 在 AndroidSigning@3 任务中:

  • <apkFiles> 是必需的,并且是要签名的 APK 文件的路径和名称。 默认为 **/*.apk
  • <apksign> 必须是 true(默认值)。
  • <keystore-file> 是安全文件库中上传的密钥存储文件的名称。
  • <apksignerKeystorePassword> 是未加密密钥存储文件的密码。
  • <apksignerKeystoreAlias> 是签名证书的密钥别名。
  • <apksignerKeyPassword> 是与指定别名关联的密钥的密码。

你可以在 YAML 中设置和使用变量,也可以使用 Azure Pipelines UI 中的变量选项卡设置变量,并在 YAML 中引用它们。

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

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 应用签名

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

获取 P12 签名证书

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

    • 要使用 Xcode 导出,请执行以下操作:

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

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

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

      4. 按住 Ctrl 选择要导出的证书,然后从菜单中选择导出证书

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

      5. 在此对话框中,输入证书名称、文件的保存位置以及用于保护证书的密码。

    • 或者,使用 iOS 签名中所描述的过程,以使用 macOS 上的 Keychain Access 应用遵循类似的过程,或者在 Windows 上生成签名证书。

  2. 将 P12 文件上传到 Azure Pipelines 安全文件库。 在上传期间,证书会被加密并以安全方式存储。

  3. 在管道中,转到变量选项卡,添加名为 P12password 的变量,并使用证书密码作为值。 请务必选择图标来保护密码,并在日志中掩盖密码。

获取您的预配配置文件

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

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

在 Azure Pipelines 中,将预配配置文件上传到安全文件库。 在上传期间,你的文件会被加密并以安全方式存储。

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

若要对你的应用进行签名和预配,你可以在每次生成过程中安装证书和配置文件,或者在 macOS 生成代理上预先安装文件

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

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

  • 在执行 Xcode 或 Xamarin.iOS 任务之前将 InstallAppleCertificate@2 任务添加到 YAML 管道中。 在此代码中,将 <secure-file.p12> 替换为上传的 .p12 文件的名称。 将此变量用于安全的 P12password

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

    注意

    InstallAppleCertificate@2 任务中,deleteCert 参数默认为 true,这会在生成后删除证书。

  • 在 Xcode 或 Xamarin.iOS 任务之前将 InstallAppleProvisioningProfile@1 任务添加到 YAML 中。 请将 <secure-file.mobileprovision> 替换为预配配置文件的名称。

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

    注意

    InstallAppleProvisioningProfile@1 任务中,removeProfile 参数默认为 true,这会在生成后删除配置文件。

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

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

你可以在 macOS 生成代理上预装签名证书和预配配置文件,而不是在生成期间安装签名证书和预配配置文件。 然后,这些文件可供内部版本继续使用。 仅当你信任有权访问代理计算机上 macOS 密钥链的人员和进程时,才使用此方法。

预安装 P12 证书

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

    sudo security import <certificate.p12> -P <password>
    
  2. 向名为 KEYCHAIN_PWD 的管道添加新变量。 将值设置为默认密钥链的密码,此密码通常是启动代理的用户的密码。 请务必选择锁形图标来保护此密码。

预安装预配配置文件

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

  2. 要在代理计算机上安装此预配配置文件,请从 macOS 终端窗口中运行以下命令。 将 <profile> 替换为预配配置文件的路径,并将 <UUID> 替换为预配配置文件 UUID,这是没有 .mobileprovision 扩展名的预配配置文件的文件名。

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

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

  • 在执行 Xcode 或 Xamarin.iOS 任务之前将 InstallAppleCertificate@2 任务添加到 YAML 管道中。 在此代码中,设置以下值:

    • 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
    
  • 添加 InstallAppleProvisioningProfile@1 任务。 在代码中:

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

macOS 生成代理现在可以安全地为所有生成对你的应用进行签名和预配,而无需进一步管理证书或配置文件。

引用 Xcode 或 Xamarin.iOS 生成任务中的安全文件

若要在管道中使用安全证书和配置文件,请在你的 Xcode 或 Xamarin.iOS 生成任务中配置以下设置。

生成任务中的安全文件引用对 signingIdentityprovisioningProfileUuid 使用变量。 这些变量由你选择的证书和预配配置文件的安装 Apple 证书安装 Apple 预配配置文件任务自动设置。

对于 Xcode:

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

对于 Xamarin.iOS:

- task: XamariniOS@2
    inputs:
      solutionFile: '**/*.iOS.csproj'
      signingIdentity: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)'
      signingProvisioningProfileID: '$(APPLE_PROV_PROFILE_UUID)'

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

详细信息: