证书(Certificate)与描述文件(Provisioning Profiles)

  在使用脚本xcodebuild自动打包的时候,会用到签名证书和描述文件,我在编译的时候搞了好长时间才搞明白,下面介绍如何获得正确配置。html

  证书:证书是用来给应用程序签名的,只有通过签名的应用程序才能保证他的来源是可信任的,而且代码是完整的, 未经修改的。在Xcode Build Setting的Code Signing Identity中,你能够设置用于为代码签名的证书。ios

  .p12:由于直接从Apple下载的证书只有公钥,没有私钥。没办法证实这个证书是你的(没有办法证实你有这个权利)。而从本地钥匙串中导出的.p12文件是包含公钥和私钥的,也就是说能够把证书上描述的权利赋予他人。xcode

  描述文件:描述文件里包含了App ID , Certificates (证书), Devices(设备)。 说明生成描述文件须要用到这些信息。咱们要打包或者在真机上运行一个应用程序,首先须要证书来进行签名,用来标识这个应用程序是合法的、安全的、完整的等等。而后须要指明它的App ID,而且验证Bundle ID是否与其一致。再次,若是是真机调试,须要确认这台设备可否用来运行程序。而Provisioning Profile就把这些信息所有打包在一块儿,方便咱们在调试和发布程序打包时使用,这样咱们只要在不一样的状况下选择不一样的profile文件就能够了。并且这个Provisioning Profile文件会在打包时嵌入.ipa的包里。安全

 1、“手动管理证书”与“自动管理证书”

  在Xcode8之后苹果引入了自动管理证书(automatically manage signing),设置自动管理证书后xcode会根据帐号证书和苹果开发者中心设置的内容,自动生成描述文件并下载到机器中使用。bash

  若是咱们想手动管理证书,请将xcode中的“automatically manage signing”勾掉。app

2、正确得到证书“经常使用名称”

  首先要安装证书或者直接安装处处的p12文件。其次要获得“经常使用名称”ide

一、打开“钥匙串访问”ui

  在“Launch”中搜索“钥匙串访问”编码

二、找到你的证书,单击鼠标右键,单击“显示简介”spa

三、其中经常使用名称就是证书名称copy待用

3、获得对应证书的描述文件

   获得证书名称还不够还须要获得描述文件(Provisioning Profiles)

   每一个用户有其相应的Provisioning Profiles配置目录在当前用目录中,个人目录以下

cd /Users/rongshenglai/Library/MobileDevice/Provisioning Profiles

   其中就是我目前持有的描述文件。

 

一、登陆“苹果开发者中心” https://developer.apple.com/

二、点击“Certificates, Identifiers & Profiles”

   这里就是个人描述文件,“Development”是开发者描述文件能够打包后在真机上安装,“Distribution”是发布描述文件若是要发布到appstore须要这个描述文件。

 

三、建立描述文件

a)单击“+”建立一个描述文件

 b)选择开发者描述文件仍是发布描述文件,选择后单击“continue”

 

c)选择appid(也就是设置此描述文件应用于那个app,若是你有多个app须要给每一个app都配置一个描述文件),选择好后单击“continue”

 d)选择那个证书可使用此描述文件,不知道全选便可,单击“Continue”

e)选择打包后能够在那些设备上使用,选择好后单击“Continue”

f)在Profile Name中输入此描述文件的名字,单击“Continue”。

四、下载描述文件

  证书建立完成后须要把描述文件手动下载到本机

  找到你要使用的描述文件(开发者、发布)单击后显示以下内容,单击“Download”后保存到 “/Users/rongshenglai/Library/MobileDevice/Provisioning Profiles” 目录中注意每一个人的我的目录不一样根据状况修改。

  下载的文件名相似“XXXX.mobileprovision” 前边的XXXX记录下来它就是描述文件名,使用时不要带.mobileprovision

  注意:刚才制做描述文件时必定要选择你使用的证书。

 4、Provisioning Profile文件的说明

如下为典型供应配置文件 *.mobileprovision 的构成简析:

(1)Name:该mobileprovision的文件名。

(2)UUID:该mobileprovision文件的真实文件名。

(3)TeamName:Apple ID帐号名。

(4)TeamIdentifier:Team Identity。

(5)AppIDName:explicit/wildcard App ID name(ApplicationIdentifierPrefix)。

(6)ApplicationIdentifierPrefix:完整App ID的前缀(TeamIdentifier.*)。

(7)DeveloperCertificates:包含了能够为使用该配置文件应用签名的全部证书<data><array>。

证书是基于 Base64 编码,符合 PEM(PrivacyEnhanced Mail, RFC 1848) 格式的,可以使用 OpenSSL 来处理(opensslx509 -text -in file.pem)。

从 DeveloperCertificates 提取 <data></data> 之间的内容到文件 cert.cer(cert.perm):

-----BEGIN CERTIFICATE-----

将<data></data>之间的内容拷贝至此

-----END CERTIFICATE-----`

Mac 下右键 QuickLook 查看 cert.cer(cert.perm),在 Keychain Access 中右键 Get Info 查看对应证书 ios_development.cer,正常状况(公私钥 KeyPair 配对)应吻合;Windows 下没有足够信息(WWDRCA.cer),没法验证该证书。

若是你用了一个不在这个列表中的证书进行签名,不管这个证书是否有效,这个应用都将 CodeSign Fail。

(8)Entitlements 键<key>对应的<dict>:

keychain-access-groups:$(AppIdentifierPrefix),参见Code Signing Entitlements(*.entitlements)。

每一个应用程序都有一个能够用于安全保存一些如密码、认证等信息的 keychain,通常而言本身的程序只能访问本身的 keychain。经过对应用签名时的一些设置,还能够利用keychain的方式实现同一开发者签证(就是相同bundle seed)下的不一样应用之间共享信息的操做。好比你有一个开发者账户,并开发了两个不一样的应用A和B,而后经过对A和B的 keychain access group 这个东西指定共用的访问分组,就能够实现共享此 keychain 中的内容。

application-identifier:带前缀的全名,例如$(AppIdentifierPrefix)com.apple.garageband。

com.apple.security.application-groups:App Group ID(group. com.apple),参见Code Signing Entitlements(*.entitlements)。

com.apple.developer.team-identifier:同Team Identifier。

(9)ProvisionedDevices:该mobileprovision受权的开发设备的UDID <array>。

 

 

参考文档:

  https://blog.csdn.net/potato512/article/details/52180916

  https://www.cnblogs.com/ym123/p/4292002.html

  https://blog.csdn.net/phunxm/article/details/42685597/