浅谈苹果开发/发布证书原理

举报
dosomething 发表于 2023/12/08 16:41:45 2023/12/08
【摘要】 前言在iOS和Mac 的开发过程中,不可避免的需要和证书、签名打交道,熟悉证书和签名机制有助于提高我们解决证书相关问题的效率,避免多走弯路,下面我将会介绍证书生成过程、校验过程,以及对签名校验过程中设计的关键技术进行介绍。 技术背景简单数据传输存在的问题当A向B发送消息的时候,可以被传输中继拦截,而发生多种泄密事件:1、Hacker窃听A向B发送的内容2、Hacker拦截A向B发送的内容,篡...

前言

在iOS和Mac 的开发过程中,不可避免的需要和证书、签名打交道,熟悉证书和签名机制有助于提高我们解决证书相关问题的效率,避免多走弯路,下面我将会介绍证书生成过程、校验过程,以及对签名校验过程中设计的关键技术进行介绍。

 

技术背景

简单数据传输存在的问题

d.png

当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的结果得到最终的传输消息

d (1).png

 

接收方:1、拆分密文和加密后的对称密钥  2、使用接收方的私钥对加密后的对称密钥进行解密  3、使用对称密钥解密密文

d (2).png

这种传输数据的逻辑解决了传统传输数据的哪些问题?

1、Hacker无法窃听A向B发送的实际内容

2、Hacker无法篡改A向B发送的内容

无法解决的问题

1、因为接收方的公钥人人都可以获取到,所以Hacker可以直接向B发送消息,发生欺诈

2、A不承认给B发送过消息

这2个问题无法解决的根本原因是没有有效手段可以验证发送者的身份。下面通过数字签名技术来解决上述的2个问题

 

改革2 身份验证-数字签名

因为公钥是对外公开的,A可以通过公钥加密内容,B、C、D也可以通过公钥加密内容,所有公钥的拥有者都可以使用并成为发送者,加密后的消息没有身份标识,这就导致A发送消息后可以否认。

前面提到过非对称加密,公钥加密的内容可以通过私钥解密,私钥加密的内容可以通过公钥解密,私钥仅由密钥生成者私密保存,公钥则对外公开,所以如果消息发送方使用私钥加密,消息接收方使用发送方的公钥来解密信息,那么接收方就可以精确的确认消息发送方了,也就解决了消息发送方否认发送的问题。使用私钥对数据摘要进行加密,就形成了签名,即数字签名。

d (3).png

通过数字签名手段可以解决:

1、消息无法被篡改

2、发送方无法否认发送

但是上述条件发生的前提是确认发送方就是发送方,即:发送方的身份可以辨别,如果无法辨别发送方就是发送方,则数据还是可以被篡改。

下图是发送者身份不明导致的数据篡改:

d (4).png

由上图可以看出发送者公钥可以被中间者篡改,而导致后面传输的数据都是不可信的,如何保证公钥是唯一的、可信的将是保障数据传输可信的重要一环,下面将要介绍的数字证书。

 

改革3 数字证书

数据传输不可信的原因是公钥无法确定身份,为此人们将一些由公信力组织和政府部门作为证书中心,使用证书中心的私钥来对使用者的公钥进行数字签名,签名后就称之为证书,而这些具有公信力的组织和政府部门就称之为CA。

证书=公钥+CA的数字签名

下面看下证书是如何起作用的

d (5).png

接收者在收到消息后,首先用CA机构的公钥验证证书的正确性,如果证书验证失败,则可以直接丢弃传输过来的数据包,如果CA公钥验证证书成功,再用证书的公钥验证数字签名。

 

结论

在正式的数据传输中,往往需要证书+对称加密结合来操作,这样才可以既保障数据无法被篡改,又能确定数据无法被查看。

d (6).png

苹果证书的解析

回顾上面所讲的公钥、私钥、数字签名、证书,对比苹果的证书

一、证书的生成

1、生成证书请求文件:钥匙链访问-》证书助理-》从证书颁发机构请求证书

此过程可以理解为创建公钥M《-》私钥M对的过程,其中生成的CertificateSigningRequest.certSigningRequest文件包含了公钥信息和开发者信息。

 

图一 请求证书

image.png

图二 填写开发者信息

image (1).png

图三 生成的请求文件

image (2).png

图四请求文件的内容

image (3).png

图五 生成的私钥保存在钥匙链中

image (4).png

2、进入开发者平台,将第一步生成的CertificateSigningRequest.certSigningRequest上传至平台,并生成对应.cer证书

此过程可以理解为,苹果自身是CA机构,我们用公钥到CA机构注册,苹果CA利用上传的公钥生成开发者证书。

图六  请求证书

 

3、下载Cer到电脑上,双击安装

此过程讲证书安装在钥匙链中,并与第1步生成的私钥M做绑定

图七 绑定好的证书和私钥M

image (5).png

上述的过程可以看作下面的流程图:

d.png

二、苹果实现签名校验的方式

苹果签名校验的目的是保证每个安装到苹果设备上的App都是经过苹果官方授权的。

d (1).png

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文件。

image (4).png

 

在使用时,在Xcode可以通过不同的模式(Debug、Release指定不同的provisionprovile)

Debug模式下设置证书

Release模式下设置证书

全局指定证书

 

1、在Mac编译完一个iOS App 后,会将Provisioning Profile 文件也打包进App 中,并将文件命名为embedded.mobileprovision。在App 安装到iOS设备上时,iOS 设备会通过预置的CA公钥信息来验证embedded.mobileprovision的签名合法性,进而验证证书中的签名是否正确。
2、在Mac编译完一个MacOS App 后,会将Provisioning Profile 文件也打包进App 中,并将文件命名为embedded.provisionprofile。在App 安装到Mac设备上时,iOS 设备会通过预置的CA公钥信息来验证embedded.provisionprofile的签名合法性,进而验证证书中的签名是否正确。
 

确保了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级:

image (8).png

2、证书的原理就是通过非对称加密达到数据传输安全的一种方式。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。