Part.1 什么是Provisioning Profile

移动开发 iOS
在iOS开发时,一般都会涉及到配置文件的安装,但是在签名的过程中往往会遇到多种问题。你可能通过google,在Stack Overflow上找到一些类似的问题,并成功把问题解决掉,然后接着做别的任务。我见过解决上面问题的方法是“删除所有的配置文件,并重头开始”。一般这是可以解决问题的,不过本系列文章的目标是让你不用删除所有的配置文件从头开始,就可以解决上面的问题。

[[71896]] 

  当你接触iOS开发,一般都会涉及到Provisioning Profile(配置文件)。大多数时候是通过苹果的“Development Provisioning Assistant”,将配置文件安装到正确的地方,并使用Keychain Access(钥匙串访问程序)获取证书和密钥,并将其安装到钥匙串中。一段时间过后,你可能会遇到如下问题:

 

Code Sign error(代码签名错误):

The executable was signed with invalid entitlements.(使用了无效的证书对程序进行了签名) 
Valid signing identity not found.(没有找到有效的签名标示) 
No unexpired provisioning profiles found that contain any of the keychain’s signing certificates(在钥匙串的签名证书中,没有发现期望的配置文件)

 

  遇到上面的问题后,你可能通过google,在Stack Overflow上找到一些类似的问题,并成功把问题解决掉,然后接着做别的任务。我见过解决上面问题的方法是“删除所有的配置文件,并重头开始”。一般这是可以解决问题的,不过本系列文章的目标是让你不用删除所有的配置文件从头开始,就可以解决上面的问题。

 

开始吧

  每个配置文件实际上都是一个用PKCS#7签名后的plist文件。PKCS一组公钥密码学标准。PKCS#7是加密消息语法的标准。苹果使用这个标准对plist文件进行签名,通过签名,OS(操作系统)可以验证被安装的程序是来自合法的开发者(通过验证可以知道plist文件中的内容有没有被修改过)。plist文件中的最后一部分是非常重要的,稍后你将知道为什么。

  在Terminal(终端程序)中使用vi打开一个配置文件,可以看到类似如下的内容:


0<82>^^è^F      *<86>H<86>÷^M^A^G^B <82>^^Ù0<82>^^Õ^B^A^A1^K0   ^F^E+^N^C^B^Z^E^@0<82>^N®^F     *<86>H<86>÷^M^A^G^A <82>^N<9f>^D<82>^N<9b><?xml version="1.0" encoding="UTF-8"?>  
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">    
<plist version="1.0">   
<dict>


上面这部分内容是PKCS#7签名的头部。往下看到的许多内容才是真正的签名:

</dict>    
   </plist>     
   <82>^M²0<82>^Cù0<82>^Bá ^C^B^A^B^B^A^_0^M^F    *<86>H<86>÷^M^A^A^E^E^@0y1^K0   ^F^CU^D^F^S^BUS1^S0^Q^F^CU^D    
    ^S    
    Apple Inc.1&0$^F^CU^D^K^S^]Apple Certification Authority1-0+^F^CU^D^C^S$Apple iPhone Certification Authority0^^^W^M080521020415Z^W^M200521020415Z0Y1^K0 ^F^CU^D^F^S^BUS1^S0^Q^F^CU^D   

    ^S   
    Apple Inc.1503^F^CU^D^C^S,Apple iPhone OS Provisioning Profile Signing0<82>^A"0^M^F     *<86>H<86>÷^M^A^A^A^E^@^C<82>^A^O^@0<82>^A

 

  注意观察上面内容的底部,可以看到类似这样的字符串:Apple Inc., Apple Certification Authority 和 Apple iPhone OS Provisioning Profile Signing,通过这些内容可以知道这个文件进行了数字签名。配置文件是通过iOS Provisioning Portal创建的。当你选择了App ID,以及适当数量的设备UDIDs和Entitlement之后,苹果会将所有的这些信息数字签名到配置文件(Provisioning Profile)中,这样iOS就可以验证配置文件是否真的由苹果分发。

 

  当这个配置文件被数字签名之后,你可能会问“我如何验证这个签名?”,在Terminal程序中,你可以使用openssl程序进行验证。Openssl不仅可以验证签名,还可以将签名信息打印出来,在Terminal程序中输入如下内容就可以进行验证:

openssl smime -in /path/to/your.mobileprovision -inform der -verify

 

  现在,如果你希望手动编辑一下配置文件。比如你想把苹果新设备的UDID添加到配置文件中(不通过Provisioning Portal)。编辑之后,验证会失败,并得到如下类似的信息:

openssl smime -in Key_Grinder_Beta_Dev.mobileprovision -inform der -verify
Error reading S/MIME message
10163:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:/SourceCache/OpenSSL098/OpenSSL098-47/src/crypto/asn1/tasn_dec.c:1315:
10163:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:/SourceCache/OpenSSL098/OpenSSL098-47/src/crypto/asn1/tasn_dec.c:657:Field=signer_info, Type=PKCS7_SIGNED
10163:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:/SourceCache/OpenSSL098/OpenSSL098-47/src/crypto/asn1/tasn_dec.c:747:
10163:error:0D08403A:asn1 encoding routines:ASN1_TEMPLATE_EX_D2I:nested asn1 error:/SourceCache/OpenSSL098/OpenSSL098-47/src/crypto/asn1/tasn_dec.c:577:Field=d.sign,Type=PKCS7

 

  这还不是我见过最好的错误(苹果限制了每个开发者账号只能最多使用100台设备,并防止你添加更多的UDIDs)

 

  本文介绍了一个配置文件的基本知识。下一篇文章将深入介绍plist文件中的内容——这些信息对你的程序和Xcode意味着什么呢?

 

来源:破船的博客

责任编辑:佚名 来源: cocoachina
相关推荐

2018-10-26 14:14:19

Zigbee无线安全网络拓扑

2013-05-03 14:21:15

应用设计

2022-02-14 09:24:15

SwiftUI协议

2011-04-01 15:53:20

T-SQLDateTime

2021-01-10 10:30:24

站点隔离Chrome漏洞

2023-07-17 07:25:48

2020-09-11 11:29:34

渗透测试风险评估网络安全

2009-03-04 10:10:49

2014-03-27 15:01:50

算法C++

2021-03-20 22:46:22

IaaSSaaSPaaS

2017-02-20 10:24:41

2020-10-26 10:58:39

Volatility的

2018-03-05 08:23:40

物联网互联网网络技术

2023-09-01 13:49:00

内存进程线程

2020-07-14 14:59:00

控制反转依赖注入容器

2015-07-08 10:35:17

2015-03-06 17:24:56

Android应用安全安卓应用安全

2017-12-19 21:29:58

物联网区块链大数据

2020-05-12 09:39:32

计算机时间系统

2020-11-20 10:51:03

云计算
点赞
收藏

51CTO技术栈公众号