苹果开发之App签名

若是你的Apple ID帐号(可以使用邮箱来注册)为Apple developer类型的话,登陆以后是看不到Certificates, Indentifiers & Profiles信息的html

Apple developer是最基础的帐号类型,主要用来在App Store下载各类应用(包括xCode等开发工具和SDK库)及在iCloud上备份文件和照片git

可经过点击下方的“Joining the Developer Program”连接,按照指引点击enroll按钮,付费99$/year以后,成为registered Apple developergithub

此时你才能看到Certificates, IDs & Profiles按钮,点击以后就能够进入Certificates, Indentifiers & Profiles面板了windows

 

Certificate(证书)api

Certificates(证书)是一个经证书受权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件安全

用于用来给应用程序签名(Signature)的,只有通过签名的应用程序才能保证它的来源是可信任的,而且代码是完整的, 未经修改的app

证书通常具备时效性,只在特定的时间段内有效。ide

 

苹果的证书分为Development和Distribution两种。Development证书用于开发和调试应用程序,可用于真机调试;Distribution证书用于打包上传App Store,用于验证开发者身份svn

Certificates列表中列出证书(.cer文件)都是公钥证书,若是这个证书是在别人机器上生成的,在机器上安装后是没有私钥与其匹配的函数

注1:在mac中,能够经过右键快捷菜单“快速查看XXX.cer”来查看证书的基本信息

注2:钥匙串访问(Keychain Access)在应用程序\实用工具(Applications\Utilities)中

你能够在本身的机器上建立一个与本机私钥相匹配的公钥证书(.cer文件)

方法1:

(1)选择证书分类,在钥匙串访问(Keychain Access)菜单:“钥匙串访问” -- “证书助理” -- “从证书颁发机构请求证书”

         用户电子邮件地址和CA电子邮件地址能够随便输入一个邮箱,常见名称为密钥的名称,点击继续后会从苹果官方CA(Certificate Authority,证书受权中心)获取获得一个证书请求文件(.certSigningRequest文件)

注:生成certSigningRequest文件过程当中,其实是生成了一对公钥和私钥(Key Pair),保存在你Mac的keychain中。代码签名正是使用这种基于非对称秘钥的加密方式,用私钥进行签名,用公钥进行验证。

以下图所示,在你Mac的keychain的login中存储着相关的公钥和私钥,而证书中包含了公钥。你只能用私钥来进行签名,因此若是没有了私钥,就意味着你不能进行签名了,因此就没法使用这个证书了,此时你只能revoke(删除)以前的证书再申请一个。

所以在申请完证书时,最好导出并保存好你的私钥。当你想与其余人或其余设备共享证书时,把私钥传给它就能够了。私钥保存在你的Mac中,而苹果生成的Certificate中包含了公钥。

当你用本身的私钥对代码签名后,苹果就能够用证书中的公钥来进行验证,确保是你对代码进行了签名,而不是别人冒充你,同时也确保代码的完整性等

(2)在页面上点击“+”建立一个新证书,选择证书类型后,须要上传第一步中的certSigningRequest文件,来生成与本机私钥相匹配的公钥证书(.cer文件)

(3)下载.cer文件,双击或将其拖入钥匙串访问(Keychain Access)中进行安装,结果以下

注:左边有个三角形箭头的证书是能够点开看到专用密钥(private key),这种证书才能用来签名应用程序

方法2:

在菜单Xcode -- “Preferences”的Accounts标签页中,登陆Apple ID帐号后,也能够看到帐号下的证书列表

点击左下角的+号能够建立并安装一个有私钥的证书

注1:点击左下角的+号来建立安装一个证书时,才会刷新XCode这个证书列表(应该是一个bug)

注2:灰色(Stauts:Not in Keychain)为没有安装到钥匙串访问(Keychain Access)的证书

         图标上带个x(Status:Missing Private Key)为安装到钥匙串访问(Keychain Access)但在本机找不到私钥相匹配的公钥证书

         正常图标为安装到钥匙串访问(Keychain Access)且本机有私钥相匹配的证书

 

从钥匙串访问(Keychain Access)将含有私钥的证书导出(.p12文件)给其余mac机器使用

(1)选中证书私钥,右键菜单选择“导出xxx...”,选择保存路径

(2)会弹出一个框,要求填入一个对p12文件加密密码(也能够不填)

(3)最后,钥匙串访问(Keychain Access)会要求输入当前帐号密码来受权输出p12证书文件

 

在mac上, 双击证书(.p12文件)或将证书拖入到钥匙串访问(Keychain Access)便可完成证书的安装

 

在windows上,导入的iOS证书会保存到证书管理器(certmgr.msc)中   

注1:可在管理器中选中对应证书进行删除

注2:含有私钥的证书的左上角有一个钥匙的小图标

UE4使用IPhonePackager.exechs)工具来在windows上安装iOS证书,命令以下:

"D:/UnrealEngine/Engine/Binaries/DotNET/IOS/IPhonePackager.exe" Install Engine -project "D:/svn/TPSProject/TPSProject.uproject" -certificate "D:/txjsj_dev.p12" -bundlename "com.ten.DGame"

若是有证书的pp文件,能够从证书管理器中导出p12格式的iOS证书,命令以下:

"D:/UnrealEngine/Engine/Binaries/DotNET/IOS/IPhonePackager.exe" ExportCertificate "D:/svn/TPSProject/TPSProject.uproject" "D:/DGame.mobileprovision" -outputcertificate "D:/mycertificate.p12"

注:生成出来的mycertificate.p12的密码(在UnrealEngine\Engine\Source\Programs\IOS\iPhonePackager\CompileTime.cs的ExportCertificate函数中写死)为:A

扩展阅读:udn:iPhonePackager Tool中文

UE4会在“平台” -- “iOS”中列出当前机器上安装的全部的iOS证书和PP文件

勾选某个证书和PP文件后,会将选中的证书和PP文件的名称记录在DefaultEngine.ini中

[/Script/IOSRuntimeSettings.IOSRuntimeSettings]
MinimumiOSVersion=IOS_10
bSupportsPortraitOrientation=False
bSupportsUpsideDownOrientation=False
bSupportsLandscapeLeftOrientation=True
PreferredLandscapeOrientation=LandscapeLeft
MobileProvision=DGame.mobileprovision
BundleIdentifier=com.ten.DGame
SigningCertificate=iPhone Developer: cert RDM (CFG5EWN5ME)

 

App ID

App ID用于标识一个或者一组应用程序,App ID须要与应用程序的Bundle ID是一致的或者匹配的

App ID主要有如下两种:
Explicit App ID:惟一的App ID,这种App ID用于惟一标识一个应用程序,例如com.ten.DGame,标识Bundle ID为com.ten.DGame的程序
Wildcard App ID:通配符App ID,用于标识一组应用程序。如:*可表示全部应用程序,com.*可表示以com.开头的全部应用程序,com.ten.*可表示以com.ten开头的全部应用程序

 

Device(设备)

Devices即设备, Devices中包含了该帐户中全部可用的设备。 每台设备使用UDID(形如:0f3f1a4430543305f21f17cb49d0c0f3f1a44305,由40个16进制数字组成的字符串,共160 bits)来惟一标识

每一个帐户中的设备数量限制是100个,Disable一台设备也不会增长名额,只能在membership year开始的时候才能经过删除设备来增长名额。详见:关于iOS测试机个数上限的详细规则

查看设备UDID

方法1:

(1)将手机经过数据线查到电脑,并在手机上信任此电脑后,就能够在iTune中查看手机的UDID

(2)以下能够看到当前手机的UDID(注:如显示为序列号、ECID、型号识别符等,请点击切换到UDID)

方法2:将手机经过数据线查到电脑,并在手机上信任此电脑后,在Xcode菜单“Window” -- “Devices and Simulators”的Devices面板中查看手机的UDID

 

Provisioning Profiles(PP文件) 

Profiles即为Provisioning Profiles文件(后缀名为.mobileprovision),简称PP文件

PP文件包含了上述的全部内容:证书、App ID、设备,决定应用程序能在那些设备上运行

注1:PP文件也分为Development和Distribution两种,必须与证书相对应

        即Development的PP文件要使用Development的证书,Distribution的PP文件要使用Distribution的证书

注2:Development的PP文件才容许使用xCode进行调试

注3:PP文件能够关联多张证书,多个设备

注4:Distribution类型的PP文件又分为In House(配合企业证书使用,没有设备限制)、Ad Hoc(只能运行在该帐户内已登记的可用设备上,最多100个设备)、App Store(上架App Store用,没有设备限制)

 

在打包或者在真机上运行一个应用程序,咱们首先须要证书来进行签名,用来标识这个应用程序是合法的、安全的、完整的等等;

而后须要指明它的App ID,而且验证Bundle ID是否与其一致;再次,若是是真机调试,须要确认这台设备可否用来运行程序。

PP文件把这些信息所有打包在一块儿,方便咱们在调试和发布程序打包时使用,这样咱们只要在不一样的状况下选择不一样的profile文件就能够了

PP文件会在打包时嵌入.ipa的包里(即名为embedded.mobileprovision的文件)

在一台设备上启动应用程序时,会用PP文件进行以下校验:

 

Mac机器上PP文件的安装目录为:/Users/<用户名>/Library/MobileDevice/Provisioning Profiles

中文路径为:/用户/<用户名>/资源库/MobileDevice/Provisioning Profiles

注:该目录在Finder中不可见,可经过菜单“前往” -- “前往文件夹...”来打开

       或者在Terminal终端中查看  cd ~/Library/MobileDevice/Provisioning\ Profiles

注1:上图中mobileprovision文件名中的UUID是从mobileprovision文本文件中读取的

<key>UUID</key>
<string>672e56b7-d5e2-45a2-acc8-00f6cde47063</string>

注2:mobileprovision文件原始的文件名也存储在mobileprovision文本文件中

<key>Name</key>
<string>PP20190723_1120</string>

注3:能够从Xcode中将Apple ID帐号中的PP文件同步到本地

在windows上,PP文件安装目录为:%homepath%\Appdata\Local\Apple Computer\MobileDevice\Provisioning Profiles

 

在Xcode中开发应用时,能够从项目工程中设置其使用的PP文件,让其对ipa文件进行签名输出(CodeSign)

注1:点击Provisioning Profile后面的上下箭头,会弹出快捷菜单

Import Profile:可导入本地的一个PP文件到PP文件的安装目录

Download Profile:若在Xcode中登陆了Apple ID帐号,会列出帐号中拥有的PP文件

注2:也能够勾选“Automatically manage signing”,让Xcode来自动管理

注3:当在Xcode中登陆了Apple ID帐号,“Automatically manage signing”下能够看到一个iOS Team Provisioning Profile的PP文件 

         该PP文件为Development类型,是利用Apple ID帐号中的最大范围的App ID + 全部的证书 + 全部设备自动生成出来的

         鼠标放在该PP文件图标上拖曳到Terminal终端中能够看到该PP文件存放的路径,如:/Users/<用户>/Library/MobileDevice/Provisioning\ Profiles/d563efb3-d555-4921-81eb-c9a32ddac164.mobileprovision

         将安装目录中的该文件删除,而后在Xcode中登陆Apple ID帐号并勾选“Automatically manage signing”,会强制利用Apple ID帐号中的资源从新生成出最新的iOS Team Provisioning Profile的PP文件

 

更详细地设置在BuildSetting中

 

Keys(extra service)

 Keys定义了开启了那些Service,如上DGame该值为2,表明开启了Apple Push Notifications service (APNs)和DeviceCheck服务

Apple Push Notifications service (APNs)
Establish connectivity between your notification server and the Apple Push Notification service. One key is used for all of your apps. 
DeviceCheck
Access per-device, per-developer data that your associated server can use in its business logic. One key is used for all of your apps. 

 

其余

Xcode中共享developerprofile来共享Apple ID帐号

(1)在Xcode登陆Apple ID帐号,点击左下角螺母图标,弹出快捷菜单“Export Apple ID and Code Signing Assets”输入保护密码后,就可导出开发者帐号(*.developerprofile)

(2)在其余机器上对应位置的快捷菜单“Import Apple ID and Code Signing Assets”输入保护密码来导入该文件

注:developerprofile文件实际为一个zip文件,改后缀解压后,里面文件列表以下:

 

参考

How to Submit An App to Apple: From No Account to App Store Part1

How to Submit An App to Apple: From No Account to App Store Part2

关于Certificate、Provisioning Profile、App ID的介绍及其之间的关系

iOS App 签名的原理 

相关文章
相关标签/搜索