如何将现有证书适配支持 fastlane match

背景

Xcode 的 Automatically manage signing 虽然方便,但是不适合多人项目,尤其是在 CI/CD 机器上部署自动化流程的场景。

iOS 签名机制复杂,各种密钥、证书、配置文件等概念一堆。在本地机器配置好一整套证书已经颇为不易,要是同事编译项目问你要证书密钥,各种导出安装,想想就头皮发麻。

Fastlane 一声炮响,送出了 match 这个大杀器。轻轻地在键盘敲下 fastlane match initfastlane match development|adhoc|appstore,就可以从无到有创建一套完成的证书配置,有新同事加入时也仅需要通过match命令在本地安装好所需要的证书。你给我翻译翻译,什么他妈的是他妈的惊喜。

fastlane match 的文档推荐把已有的证书清空,清清爽爽地使用 match 创建证书。如果你不在乎已有项目的证书配置等,fastlane 提供了 Nuke 命令帮助你删除,不过用之前认真考虑下。

但是如果你跟我一样,担心废弃旧证书会给正在开发的队友造成不必要的麻烦,且本意是为了方便后续加入开发的队友安装证书,你可以按照接下来的教程,手动地将现有的证书迁移到 fastlane match 仓库。

步骤

创建 fastlane match repository

fastlane match 依赖 git 仓库同步,可以创建一个空仓库。

将后续步骤中得到的文件放置在仓库中,文件结构应该如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.
├── README.md
├── certs
│   ├── development
│   │   ├── developement_cert_id.cer
│   │   └── developement_cert_id.p12
│   └── distribution
│   ├── distribution_cert_id.cer
│   └── distribution_cert_id.p12
├── match_version.txt
└── profiles
├── adhoc
│   └── AdHoc_bundle_id.mobileprovision
├── appstore
│   └── AppStore_bundle_id.mobileprovision
└── development
└── Development_bundle_id.mobileprovision

准备 certificate id

fastlane match profile 仓库中证书都是 certificate_id.cer 命名,所以需要准备证书的 id,后面简称 cert id。

Michał Laskowski 提到 Keychain 中看不了 certificate id,给了下面一个 ruby 脚本从 Apple Developer Portal 获取。

1
2
3
4
5
6
7
8
9
require 'spaceship'

Spaceship::login("your@apple.id")
Spaceship::select_team

Spaceship::certificate.all.each do |certificate|
cert_type = Spaceship::Portal::Certificate::CERTIFICATE_TYPE_IDS[certificate.type_display_id].to_s.split('::').last
puts "#{certificate.id} - #{certificate.name} - #{certificate.status} - #{cert_type}"
end

其实,我观察到还有一种方式可以获取到 cert id:在 Apple Developer Portal 点开具体的 certificate,在浏览器 Url Path 上显式展示了 cert id。

形式同 https://developer.apple.com/account/resources/certificates/download/cert_id

加密证书

从 KeyChain 中导出想要迁移到 match 的证书,导出为 certificate.cercertificate.p12 ,通过以下步骤进行加密。

1
2
3
4
5
6
7
# 1.
openssl pkcs12 -nocerts -nodes -out key.pem -in certificate.p12
# 2.
openssl aes-256-cbc -k your_password -in key.pem -out cert_id.p12 -a
# 3.
openssl aes-256-cbc -k your_password -in certificate.cer -out cert_id.cer -a

按照证书类型,将 cert_id.p12cert_id.p12 放置在 match 仓库中。

准备 Profile

从 Apple Developer Portal 下载类型为 development | Ad hoc | App Store 的 Profiles,根据证书类型和项目的 bundle id 进行命名,格式如下。然后放置在 match 仓库中。

1
2
3
Development_your.bundle.id.mobileprovision
AppStore_your.bundle.id.mobileprovision
AdHoc_your.bundle.id.mobileprovision

使用

至此, fastlane match 仓库准备完成了,推到远端,按照 match 文档配置你的 Fastfile,进行尝试吧。

参考资料

  1. Simplify your life with fastlane match
  2. fastlane docs | match