对移动应用进行签名

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. 在 macOS 上使用 Xcode 或 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,允许访问默认密钥链。
    • keychainPassword:变量 KEYCHAIN_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 预配配置文件的名称。
    • false设置为removeProfile在内部版本之间保留配置文件。
    - task: InstallAppleProvisioningProfile@1
        inputs:
          provProfileSecureFile: '<secure-file.mobileprovision>'
          removeProfile: false
    

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

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

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

生成任务中的安全文件引用使用变量和 signingIdentity provisioningProfileUuid. 这些变量由 “安装 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)'

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

详细信息: