iOS开发者证书-详解/生成/使用
本文假设你已经有一些基本的Xcode开发经验, 并注册了iOS开发者账号.
相关基础
加密算法
现代密码学中, 主要有两种加密算法: 对称密钥加密 和 公开密钥加密.
对称密钥加密
对称密钥加密(Symmetric-key algorithm)又称为对称加密, 私钥加密, 共享密钥加密.
这类算法在加密和解密时使用相同的密钥.
例如: 最常见的应用场景 - 系统登陆.
要成功登陆系统, 你必须输入正确的密码, 这密码是唯一的, 是与创建时一样的. 同样 的, 其他人要成功登陆, 他也要输入这唯一的正确的密码.
公开密钥加密
公开密钥加密(public-key cryptography, 也称为非对称密钥加密).
这类算法在加密和解密时使用不相同的密钥.
这类加密算法对应有两个密钥: 公钥和私钥. 公钥, 是公开的, 任何人都可以获得; 私钥 , 是私密的, 只由持有者所有.
这类加密算法的特点是: 用公钥加密的内容只能用私钥解密, 用私钥加密的内容只能 用公钥解密.
这类加密算法的特点决定了, 它即可以用于实现数据加密, 又可以用于实现身份认证 (数字签名).
加密 & 认证
我们需要区分加密和认证这两个基本概念.
加密是将数据资料加密, 使得非法用户即使取得加密过的资料, 也无法获取正确的资料 内容, 所以数据加密可以保护数据, 防止监听攻击. 其重点在于数据的安全性.
身份认证是用来判断某个身份的真实性, 确认身份后, 系统才可以依其身份给予相应的 权限. 其重点在于用户的真实性.
要实现这两个要求(加密和认证), 都需要用到加密算法, 但并不是所有的算法都可实现身 份认证. 身份认证现在一般使用公开密钥加密算法.
下面将重点说明如何使用公开密钥加密算法实现加密和认证.
如何实现加密?
对于某一用公钥加密的数据, 只能由对应的私钥解密.
例如, 我要给你发一封加密邮件. 我必须有你的公钥, 我用你的公钥给邮件加密. 这样 就能保证邮件不被别人看到, 而且不被篡改. 因为只有你可以用你自己的私钥解密.
如何实现认证?
对于某一用私钥加密的数据, 只能由对应的公钥解密. (记住, 私钥只由持有人所有)
用我(A1)的私钥给邮件加密, 发给你(B1)之后, 你能用我的公钥解密. 这样就能保证 邮件是我(A1)发的.
数字身份证 & 数字证书(Certificates) & 数字证书认证机构(CA) & 根证书
数字身份证
数字身份证, 是身份标识方式的一种, 是一对"钥匙", 即一对公钥&私钥. 它一般 用本地系统工具生成.
o
数字证书认证机构
数字证书认证机构(CA, Certificate Authority), 是负责发放和管理数字证书的权威机构, 并作为交易中受信任的第三方, 承担公钥体系中公钥的合法性 检验的责任.
数字证书
数字证书, 是一种用于计算机的身分识别机制. 数字证书不是数字身份证, 而是身份认证机构(数字证书认证机构)在数字身份证上加上数 字签名. 这一行为表示身份认证机构已认定这个持证人. 这里的"认定"是怎么做到 的呢? 参考'如何验证数字证书的有效性?'.
- 证书发布者
- 证书持有者
- 有效期(证书在这个时期之前或之后无效)
- 证书持有者的公钥(*)
- 证书扩展, 包含一些额外信息
- 所使用的哈希算法
- 数字签名, 该数字签名是对以上信息的哈希值用CA的私钥加密生成(*)
如何验证数字证书的有效性?
即, 如何确保数字证书是经过CA认证的呢?
注意: 对于某一用私钥加密的数据, 只能由对应的公钥解密.
原理: 计算数据证书的数据信息的哈希值H1, 对证书上的数字签名用CA的公钥解密得 H2, 如果H1等于H2, 则该证书有效, 且是经CA认证的.
CA的公钥如何获得呢? 它包含在根证书里.
根证书
根证书, 是CA给自己颁发的数字证书, 是信任链的起始点. 它一 般放在CA网站上, 供任何人下载.
数字签名
数字签名, 是一种类似写在纸上的普通的物理签名, 但是使用了公钥加密领域的 技术实现, 用于鉴别数字信息的方法.
数字签名具有完整性, 不可抵赖性(即不可否认性).
从'如何实现认证?'一节, 我们知道可以利用公开加密算法的特点实现"认证", 也就是签 名. 但是这会有一个问题, 任何人都可以或可能冒充我(A1)! 即, 任何人都可以冒充我 (A1)把他经用他的私钥加密的数据和他的公钥发给你. 也就是说, 你无法确保你接收到的 公钥就是我(A1)的!
所以, 这就需要一个机制来保证. 这机制就是基于前面所说的"数字证书"和"CA". 它可确 保我(A1)是经过CA认证的.
数字签名原理
-
签名:
发送者先对要发送的"数据"计算一个哈希值, 再用自己的私钥对这个哈希值加密生成一 个"签名(值)", 同时发送者要拥有一个向CA申请得到的"数字证书"(记住, 其记录有公 钥), 最后发送者把"数据", "签名(值)"和"数字证书"一起发送给接收者.
-
验证签名:
接收者接收到发来的"数据", "签名(值)"和"数字证书"后, 会作一系列验证来判断这一数 字签名是否有效:
- 打开并验证"数字证书"的有效性;
- 计算"数据"的哈希值H1, 用"数字证书"记录的公钥对"签名(值)"进行解密得到值H2, 如 果H1==H2, 则该"数字签名"有效.
Xcode代码签名相关
Keychain
MAC下用于存储和管理密钥等私密信息的工具.
Identifiers / Bundle ID / App ID
这是应用的唯一标识.
Device UUID
这是设备的唯一标识.
Provisioning Profiles
这就是我们最后要生成的 Profiles, 它记录了 App ID, UUID 和其所信任的证书.
当Xcode要把一个应用部署到真机上时, 会作相应检验:
- Keychain中是否有相匹配的有效证书? 参考'如何验证数字证书的有效性?'
- Profiles是否有效? 参考'数字签名原理'
- 要部署的App的App ID是否与Profiles记录的App ID相匹配?
- UUID是否相匹配?
只有在所有检验都通过了, 才能部署到真机上.
Start
生成密钥
填上Email和Name, 并选择"Saved to disk".
最后在"keys"下生成一对新的密钥, 为了以后分辨方便, 最好对它重新命名, 双击可以重 命名. 同时也会生成一个CRS文件.
安装根证书
这个证书叫做 Worldwide Developer Relations Certificate Authority, 通过这个链接 可以下载: https://developer.apple.com/certificationauthority/AppleWWDRCA.cer, 一般下载下来的文件名为: AppleWWDRCA.cer.
该证书一般由 Xcode 自动安装.
向Apple(CA)申请开发者证书
登陆苹果开发者中心, 到 Certificates, Identifiers & Profiles | iOS Apps | Certificates | Development
下, 新增一个Certificates:
点下一步会出现, 要求你先生成一个CRS文件, 这就是我们在"生成密钥"时做的:
直接下一步, 并把刚才生成的CRS文件上传, 最后提交生成证书. 把它下载下来, 双击, 其会自动添加到Keychains中.
创建 App ID
在Identifiers
下创建一个新的App ID.
把设置的UUID加入Devices注册列表
在Devices
下添加.
生成Profiles
在 Certificates, Identifiers & Profiles | iOS Apps | Provisioning Profiles | Development
下, 点击添加一个新的Profiles.
到"选择证书"页面时, 有一点要注意, 最好只选上刚刚生成的证书, 不要选择所有. 因为 "选择所有"在Keychain中已有别的证书下, 容易出现各种奇葩问题, 后面会有详细说明.
最后, 把它下载下来, 双击添加到Xcode中.
配置到Xcode
至此, 一切OK!
可能遇到的错
如果你按上面的执行下来, 最后一编译应用发现还是不行, 报类似这种错,
在XcodeOrganizer中也会显示出错:
这错一般是由于证书不匹配, 要检查:
保证生成Profile时, 选择且只选择了一个证书;
保证Keyschain里没有重复的证书.