浅谈苹果开发/发布证书原理
前言
在iOS和Mac 的开发过程中,不可避免的需要和证书、签名打交道,熟悉证书和签名机制有助于提高我们解决证书相关问题的效率,避免多走弯路,下面我将会介绍证书生成过程、校验过程,以及对签名校验过程中设计的关键技术进行介绍。
技术背景
简单数据传输存在的问题
当A向B发送消息的时候,可以被传输中继拦截,而发生多种泄密事件:
1、Hacker窃听A向B发送的内容
2、Hacker拦截A向B发送的内容,篡改后发送给B
3、Hacker直接给B发送自定义消息,发生欺诈
4、A不承认给B发送过消息
改革1 防止被窃听-加密与解密
在互联网通信过程中,数据传输无法避免被第三方拦截,我们能做的是在被拦截的情形下,监听者无法获取有效信息,现在有效的手段是加密。
目前加密算法分为两大类:对称加密和非对称加密:
对称加密的特点就是加密和解密公用同一个密钥,常见的对称加密算法由,AES,DES
非对称加密的特点是加密和解密使用不同的密钥,密钥成对出现,称之为公钥和私钥,公钥加密的内容只能由私钥解密,反之亦然,私钥通常秘密保护,而公钥则公而广之,最常见的算法有RSA
对比对称加密和非对称加密对比:对称加密速度要比非对称加密快很多,但是对称加密的安全性要差很多,所以在实际的应用中通常是对称加密和非对称加密混合使用。
发送方:1、对消息采用对称加密 2、对对称加密密钥使用接收者的公钥进行非对称加密 3、组合1和2的结果得到最终的传输消息
接收方:1、拆分密文和加密后的对称密钥 2、使用接收方的私钥对加密后的对称密钥进行解密 3、使用对称密钥解密密文
这种传输数据的逻辑解决了传统传输数据的哪些问题?
1、Hacker无法窃听A向B发送的实际内容
2、Hacker无法篡改A向B发送的内容
无法解决的问题
1、因为接收方的公钥人人都可以获取到,所以Hacker可以直接向B发送消息,发生欺诈
2、A不承认给B发送过消息
这2个问题无法解决的根本原因是没有有效手段可以验证发送者的身份。下面通过数字签名技术来解决上述的2个问题
改革2 身份验证-数字签名
因为公钥是对外公开的,A可以通过公钥加密内容,B、C、D也可以通过公钥加密内容,所有公钥的拥有者都可以使用并成为发送者,加密后的消息没有身份标识,这就导致A发送消息后可以否认。
前面提到过非对称加密,公钥加密的内容可以通过私钥解密,私钥加密的内容可以通过公钥解密,私钥仅由密钥生成者私密保存,公钥则对外公开,所以如果消息发送方使用私钥加密,消息接收方使用发送方的公钥来解密信息,那么接收方就可以精确的确认消息发送方了,也就解决了消息发送方否认发送的问题。使用私钥对数据摘要进行加密,就形成了签名,即数字签名。
通过数字签名手段可以解决:
1、消息无法被篡改
2、发送方无法否认发送
但是上述条件发生的前提是确认发送方就是发送方,即:发送方的身份可以辨别,如果无法辨别发送方就是发送方,则数据还是可以被篡改。
下图是发送者身份不明导致的数据篡改:
由上图可以看出发送者公钥可以被中间者篡改,而导致后面传输的数据都是不可信的,如何保证公钥是唯一的、可信的将是保障数据传输可信的重要一环,下面将要介绍的数字证书。
改革3 数字证书
数据传输不可信的原因是公钥无法确定身份,为此人们将一些由公信力组织和政府部门作为证书中心,使用证书中心的私钥来对使用者的公钥进行数字签名,签名后就称之为证书,而这些具有公信力的组织和政府部门就称之为CA。
证书=公钥+CA的数字签名
下面看下证书是如何起作用的
接收者在收到消息后,首先用CA机构的公钥验证证书的正确性,如果证书验证失败,则可以直接丢弃传输过来的数据包,如果CA公钥验证证书成功,再用证书的公钥验证数字签名。
结论
在正式的数据传输中,往往需要证书+对称加密结合来操作,这样才可以既保障数据无法被篡改,又能确定数据无法被查看。
苹果证书的解析
回顾上面所讲的公钥、私钥、数字签名、证书,对比苹果的证书
一、证书的生成
1、生成证书请求文件:钥匙链访问-》证书助理-》从证书颁发机构请求证书
此过程可以理解为创建公钥M《-》私钥M对的过程,其中生成的CertificateSigningRequest.certSigningRequest文件包含了公钥信息和开发者信息。
图一 请求证书
图二 填写开发者信息
图三 生成的请求文件
图四请求文件的内容
图五 生成的私钥保存在钥匙链中
2、进入开发者平台,将第一步生成的CertificateSigningRequest.certSigningRequest上传至平台,并生成对应.cer证书
此过程可以理解为,苹果自身是CA机构,我们用公钥到CA机构注册,苹果CA利用上传的公钥生成开发者证书。
图六 请求证书
3、下载Cer到电脑上,双击安装
此过程讲证书安装在钥匙链中,并与第1步生成的私钥M做绑定
图七 绑定好的证书和私钥M
上述的过程可以看作下面的流程图:
二、苹果实现签名校验的方式
苹果签名校验的目的是保证每个安装到苹果设备上的App都是经过苹果官方授权的。
1、首先在Mac生成密钥对(公钥M和私钥M),私钥M保存在钥匙链,公钥M保存在CSR文件中,苹果也会生成一对密钥对(CA公钥和CA私钥),CA私钥秘密保存,公钥存储到所有的苹果设备中。Mac电脑可以通过钥匙链查看苹果CA公钥。
2、开发者通过开发者后台将公钥M上传到苹果服务器,苹果服务器使用CA私钥对公钥M进行数字签名,并生成cer证书。
3、开发者将生成好的cer证书下载到Mac电脑上,并安装到钥匙链中,系统将证书和对应的私钥进行绑定并存储到钥匙链中。
4、开发过程中,使用绑定好的证书的私钥签名IPA的Macho和资源文件,并将证书信息文件(provisionprofile)保存到IPA中(此处只讨论iOS,MacOS的dmg同理)。
(2)此处为什么使用provisionprofile而不使用cer证书?
5、IPA发送到苹果设备,苹果设备通过配置的苹果CA公钥对IPA中的证书文件(provisionprofile)进行校验,校验失败则安装失败
6、证书文件校验成功后,苹果设备拿证书文件对IPA中的Macho和资源文件进行校验,校验失败则安装失败,校验成功则继续安装,后面安装和证书无关,这里不再赘述,感兴趣的可以google一下。
根据此过程提出2个问题:
1、只要拥有苹果开发者证书,是不是就可以将任意的App安装在任意的测试机器上?
2、IPA使用系统权限如沙盒、调试、外设(蓝牙、音响、话筒)等是怎么获取的?
2.1、P12解析
在上述的签名和校验的过程中,我们可以看到对App进行签名主要用到2个信息,私钥M和证书。因此只需要将这2个信息提供给团队其他成员,团队成员就可以进行App签名。在cer证书安装后,我们知道钥匙链会将私钥M和证书进行绑定,钥匙链支持我们将此绑定导出为P12文件,我们将P12提供给团队其他成员即可。
2.2、权限管控
Xcode在编译打包时会执行codesign命令进行代码签名,其中--entitlements参数指定签名的Macho文件所具备的权限
打开AppName.app.xcent文件
这些就是我们的App所具备的权限,他们会被写入Macho文件(可执行文件),App执行期间,如果使用非指定的权限,则不会生效,只有这里指定了功能才可以生效。
我们可以通过ldid -e machoPath来查看文件权限。或者通过codesign -d -v --entitlements - machoPath
那么有人可能想问了,我们是否可以指定root权限?
1、当时是不可以的,虽然这里我们申请了root权限,但是我们的app安装目录在/Applications下,非系统App,操作系统不会认定此权限生效的,同样如果我们上传到appstore的包指定调试权限,也不会是生效的。
2、下面我们将介绍provisionprofile,此文件也是约束App权限的文件,entitlements和provisionprofile相互协调才可以完成权限申请。
2.3 provisionprofile文件
Provisioning profile act as a link between the device and the developer account. During development, you choose which devices can run your app and which app services your app can access. A provisioning profile is downloaded from your developer account and embedded in the app bundle, and the entire bundle is code-signed.
Provisioning Profile 是一个由苹果证书中心加密签名的一个plist文件,包含有与之绑定的App ID、设备的UUID列表、过期时间、TeamID、entilements等信息以及用于对应用程序进行签名的证书,是苹果用来解决对设备授权以及管控APP敏感权限的解决方案。
此文件从开发者中心下载后,可以通过右键用Xcode打开,Xcode会自动帮忙管理,并放置到~/Library/MobileDevice/Provisioning Profiles目录下,并重命名为.mobileprovision文件。
在使用时,在Xcode可以通过不同的模式(Debug、Release指定不同的provisionprovile)
Debug模式下设置证书
Release模式下设置证书
全局指定证书
确保了embedded.mobileprovision 里的数据都是苹果授权以后,就可以使用其中的信息来校验本次安装的合法性,使用公钥M验证Mach-O 的签名信息、验证证书的签名及有效期、验证设备ID是否在设备列表中、Provisioning Profile 中的App ID是否与BundleID是否匹配等等;
值得注意的一点是:设备列表只在Development证书下生效,因为Enterprise 、Distribution 证书本身就是要求可以任意安装,所以不受设备列表的限制;过期时间只对Development、Enterprise 证书生效,Distribution 证书下不受限制,这也是当Development、Enterprise 证书过期后会导致应用无法安装或无法启动,而从App Store下载的应用不会有时间限制。
当然在开发者中心可以随时对Provisioning Profile 进行修改,更新不会对已有Provisioning Profile 产生影响。
现在回过头去看下上面的几个问题,就不是问题了。
总结
1、CA机构考虑到私钥可能被泄密,所以证书都是分层级的,根CA证书在平时并不作为签名三方公钥的证书,而是创建二级证书,三级证书,由根证书签名二级证书,二级证书签名三级证书,三级证书对应的私钥签名开发者公钥,当三级证书对应的私钥泄露后,可以马上废弃原有的三级证书,由二级证书签名新的三级证书并应用,同理二级证书对应的私钥泄露后,根证书签名新的二级证书,再有新的二级证书签名新的三级证书,所以根证书是需要绝密保存的,这是苹果作为CA机构自己的策略,同样对华为也是用,也是分为了几层证书。
我们可以通过钥匙链查看苹果证书分为2级:
2、证书的原理就是通过非对称加密达到数据传输安全的一种方式。
- 点赞
- 收藏
- 关注作者
评论(0)