我是前言#
- 签名机制需要了解 非对称加密,摘要,数字签名,证书概念非对称加密解决数据传递的保密性中途窃取无法解开,摘要是数据特性,保持数据的完整,数字签名是非对称加密和摘要的结合。一起解决数据的安全,和完整。证书保证了发送公钥的一方是值得信任的。
什么是非对称密钥加密?#
- 非对称加密就是指加密密钥和解密密钥是不同的,而且加密密钥和解密密钥是成对出现。非对称加密又叫公钥加密,也就是说成对的密钥,其中一个是对外公开的,所有人都可以获得,或者说可以把这个公钥给很多人,称为公钥,而与之相对应的称为私钥,只有这对密钥的生成者才能拥有。
非对称密钥的特性#
- 一个私钥对应一个公钥,公钥可以分发多人
- 一个公钥加密后的密文可以通过私钥进行解密,一个私钥加密的密文可以通过公钥进行解密
私钥公钥加密用法:#
- 对信息保密,将明文经过公钥进行加密,传送给他人,只有拥有私钥的才能解密进行阅读。中途窃取无法解密。
什么是摘要算法?#
摘要算法是指,可以将任意长度的文本,通过一个算法,得到一个固定长度的文本。
摘要算法具有以下重要特性:#
只要源文本不同,计算得到的结果,必然不同
无法从结果反推出源
文件如果发生改变,数字摘要的值也将发生变化。【摘要的唯一性】摘要算法,有 MD5 和 SHA,摘要算法主要为了验证信息完整,无修改。
什么是数字签名?#
将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用 HASH 函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性(来源百度百科)
下图中可以看出其用法

从上面可以看出,数字签名是摘要算法与私钥公钥加密的结合使用。
什么是数字证书?#
- 首先数字证书和我们平常用的证书在功能方面有一定的相似。生活中用的证书,如大学毕业证书,这个是机构颁发,向用人单位证明,我是什么学校毕业的。让用人单位相信你。数字证书就是,比如苹果公司就可以签发跟苹果公司有关的证书,而跟 web 访问有关的证书则是又几家公认的机构进行签发。这些签发机构称为 CA(Certificate Authority)。验证方是 ios 设备,以及浏览器。验证过程已经写在 ios 设备上以及浏览器上。
- 证书保证身份不被冒充。证书里面有公钥。
什么是证书授权链?#
苹果 MC(Member Center)中获得的证书实际也是一个包含有证书链的证书,其中的根是苹果的 CA。我们获得的证书实际上是在告诉 iOS 设备:我们的证书是被苹果 CA 签过名的合法的证书。而 iOS 设备在执行 app 前,首先要先验证 CA 的签名是否合法,然后再通过证书中我们的公钥验证程序是否的确是我们发布的,且中途没有对程序进行过篡改。
ios 开发需要申请证书,并且需要签名,下图是一个别人画的流程图可以参看
先申请证书,ios 设备对证书认证(内置证书机构),取出里面的公钥,对经私钥签名的代码以及资源进行解密,确保安全后安装。

怎么才能申请 iOS 证书呢?#
我们知道,如果我们开发 ios 程序,必须成为 ios 开发者,不然只能在模拟器上跑程序,并且也不能发布,只有成为开发者才能有权限申请证书。并且将证书安装到 xcode,xcode 信任此证书才能用我们自己的私钥进行代码签名。
成为开发者后通过过 keychain 生成一个 CSR 文件,提交给苹果的 Apple Worldwide Developer Relations Certification Authority(WWDR)证书认证中心进行签名最后得到一个证书,从苹果官网下载并安装使用。
生成的 CSR 文件包括#
- 申请者信息,此信息是用申请者的私钥加密的
- 申请者公钥,此信息是申请者使用的私钥对应的公钥
- 摘要算法和公钥加密算法
申请的证书包含什么?#
- 苹果取出 CertificateSigningRequest.certSigningRequest 中的公钥,根本不管我的其他信息,然后将我的 MC 账号信息和我提交的公钥封装在证书中,并进行数字签名(用 apple 的私钥)。双击安装证书后可看见下图

这个证书里有一个公钥,对应一个私钥, 后续在程序上真机的过程中,会使用这个私钥,对代码进行签名,而公钥会附带在 mobileprovision 文件中,打包进 app。 所以当有证书,然后没有私钥也是没有用的,需要证书的公钥与电脑的私钥关联起来。这是一个联合的机制。
多人开发怎么解决一机一私钥的问题呢?#
给出的解决方案就是“私钥导出”。没错,既然问题的关键是私钥,我们共享私钥不就行了,将最初申请证书的机器的私钥导出成.p12 文件,并让其他机器导入,同时其他机器也应该安装下载下来的证书。 由于 iOS 证书有多种类型,用于不同的用处,所以我们可能后续还会去 MC 上申请别的证书。所以强烈建议 CertificateSigningRequest.certSigningRequest 需要保留,因为如果再次生成 CertificateSigningRequest.certSigningRequest 文件,可能就是对应另一个私钥了!还需要在共享一次私钥,会比较麻烦。
申请证书有哪些类型呢?#
iOS App Development。开发、真机调试用
Apple Push Notification service SSL (Sandbox)。开发阶段使用苹果的推送服务
App Store and Ad Hoc。上架和AdHoc方式发布时用
Apple Push Notification service SSL (Production)。上架后使用苹果推送服务
InHouse。企业版发布,需$299才能拥有,还需邓氏编码
描述文件【mobileprovision】#
mobileprovision 文件包含:#
- AppId.每个 app 必须在 MC 中创建一个对应的 AppId。规则不累述了。
- 使用哪些证书。上面说了,不同类型的证书就代表了不同的发布方式,还包括一些功能的能否使用(比如 APN)
- 功能授权列表
- 可安装的设备列表。对于 AdHoc 方式发布的 app 或者真机调试时,会有一个列表,这个列表里面是 iOS 设备的 UDID,每台 iOS 设备出厂的 UDID 都不同,所以可以用来标识设备。可通过 iTunes 连接设备,或者http://fir.im/udid这里获取
- 苹果的签名
AdHoc 发布和真机调试#
AdHoc 允许将测试版 app 发布给有限的设备安装,而无需通过 appstore 的审核。这里的关键是如何控制哪些设备可以装。答案就是 mobileprovision 文件,记得你在生成 mobileprovision 文件的时候需要选设备的 UDID 吧,所以这些设备需要事先添加到 MC 的 Devices 里面。对于开发时候的真机调试,原理差不多。都是通过 mobileprovision 的条目 4 来做到的。而苹果对于调试和测试用机的数量限制为 100 台!