iOS开发者证书-详解/生成/使用

08/15/2015 20:16 下午 posted in  Xcode

转载:http://nuoerlz.is-programmer.com/posts/47670.html
本文假设你已经有一些基本的Xcode开发经验, 并注册了iOS开发者账号.

#相关基础

##加密算法

现代密码学中, 主要有两种加密算法: 对称密钥加密公开密钥加密.

###对称密钥加密

对称密钥加密(Symmetric-key algorithm)又称为对称加密, 私钥加密, 共享密钥加密.

这类算法在加密和解密时使用相同的密钥.

例如: 最常见的应用场景 - 系统登陆.

要成功登陆系统, 你必须输入正确的密码, 这密码是 唯一的, 是与创建时一样的. 同样 的, 其他人要成 功登陆, 他也要输入这唯一的正确的密码.

###公开密钥加密

公开密钥加密(public-key cryptography, 也称为非对称密钥加密).

这类算法在加密和解密时使用不相同的密钥.

这类加密算法对应有两个密钥: 公钥和私钥. 公钥, 是公开的, 任何人都可以获得; 私钥 , 是私密的, 只由持有者所有.

这类加密算法的特点是: 用公钥加密的内容只能用私钥解密, 用私钥加密的内容只能 用公钥解密.

这类加密算法的特点决定了, 它即可以用于实现数据加密, 又可以用于实现身份认证 (数字签名).

###加密 & 认证

我们需要区分加密和认证这两个基本概念.

  1. 加密是将数据资料加密, 使得非法用户即使取得加密过的资料, 也无法获取正确的资料 内容, 所以数据加密可以保护数据, 防止监听攻击. 其重点在于数据的安全性.

  2. 身份认证是用来判断某个身份的真实性, 确认身份后, 系统才可以依其身份给予相应的 权限. 其重点在于用户的真实性.

要实现这两个要求(加密和认证), 都需要用到加密算法, 但并不是所有的算法都可实现身 份认证. 身份认证现在一般使用公开密钥加密算法.

下面将重点说明如何使用公开密钥加密算法实现加密和认证.

###如何实现加密?

对于某一用公钥加密的数据, 只能由对应的私钥解密.

例如, 我要给你发一封加密邮件. 我必须有你的公钥, 我用你的公钥给邮件加密. 这样 就能保证邮件不被别 人看到, 而且不被篡改. 因为只有你可以用你自己的 私钥解密.

###如何实现认证?

对于某一用私钥加密的数据, 只能由对应的公钥解密. (记住, 私钥只由持有人所有)

用我(A1)的私钥给邮件加密, 发给你(B1)之后, 你 能用我的公钥解密. 这样就能保证 邮件是我(A1)发的.

##数字身份证 & 数字证书(Certificates) & 数字证书认证机构(CA) & 根证书

###数字身份证

数字身份证, 是身份标识方式的一种, 是一对"钥匙", 即一对公钥&私钥. 它一般 用本地系统工具生成.

###数字证书认证机构

数字证书认证机构(CA, Certificate Authority), 是负责发放和管理数字证书的权威机构, 并作为交易中受信任的第三方, 承担公钥体系中公钥的合法性 检验的责任.

###数字证书

数字证书, 是一种用于计算机的身分识别机制. 数字证书不是数字身份证 , 而是身份认证机构(数字证书认证机构)在数字身份证上加上数 字签名. 这一行为表示身份认证机构已认定这个持证人. 这里的"认定"是怎么做到 的呢? 参考'如何验证数字证书的有效性?'.

数字证书一般含这样一些信息:

证书发布者
证书持有者
有效期(证书在这个时期之前或之后无效)
证书持有者的公钥()
证书扩展, 包含一些额外信息
所使用的哈希算法
数字签名, 该数字签名是对以上信息的哈希值用CA的 私钥加密生成(
)

###如何验证数字证书的有效性?

即, 如何确保数字证书是经过CA认证的呢?

注意: 对于某一用私钥加密的数据, 只能由对应的公钥解密.

原理: 计算数据证书的数据信息的哈希值H1, 对证书上的数字签名用CA的公钥解密得 H2, 如果H1等于H2, 则该证书有效, 且是经CA认证的.

CA的公钥如何获得呢? 它包含在根证书里.

###根证书

根证书, 是CA给自己颁发的数字证书, 是信任链的起始点. 它一 般放在CA网站上, 供任何人下载.

###数字签名

数字签名, 是一种类似写在纸上的普通的物理签名, 但是使用了公钥加密领域的 技术实现, 用于鉴别数字信息的方法.

数字签名具有完整性, 不可抵赖性(即不可否认性).

从'如何实现认证?'一节, 我们知道可以利用公开加密算法的特点实现"认证", 也就是签 名. 但是这会有一个问题, 任何人都可以或可能冒充我(A1)! 即, 任何人都可以冒充我 (A1)把他经用他的私钥加密的数据和他的公钥发给你. 也就是说, 你无法确保你接收到的 公钥就是我(A1)的!

所以, 这就需要一个机制来保证. 这机制就是基于前面所说的"数字证书"和"CA". 它可确 保我(A1)是经过CA认证的.

###数字签名原理

1.签名:

发送者先对要发送的"数据"计算一个哈希值, 再用自己的私钥对这个哈希值加密生成一 个"签名(值)", 同时发送者要拥有一个向CA申请得到的"数字证书"(记住, 其记录有公 钥), 最后发送者把"数据", "签名(值)"和"数字证书"一起发送给接收者.

2.验证签名:

接收者接收到发来的"数据", "签名(值)"和"数字证书"后, 会作一系列验证来判断这一数 字签名是否有效:

打开并验证"数字证书"的有效性;
计算"数据"的哈希值H1, 用"数字证书"记录的公钥对"签名(值)"进行解密得到值H2, 如 果H1==H2, 则该"数字签名"有效.

Digital_Signature_diagram

##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

###生成密钥

request_cer

request_cer_info

填上Email和Name, 并选择"Saved to disk".

最后在"keys"下生成一对新的密钥, 为了以后分辨方便, 最好对它重新命名, 双击可以重 命名. 同时也会生成一个CRS文件.

request_cer_done

###安装根证书

这个证书叫做 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:

cer_add

点下一步会出现, 要求你先生成一个CRS文件, 这就是我们在"生成密钥"时做的:
cer_req

直接下一步, 并把刚才生成的CRS文件上传, 最后提交生成证书. 把它下载下来, 双击, 其会自动添加到Keychains中.

cer_in_keys

cer_in_cers

###创建 App ID

在Identifiers下创建一个新的App ID.

###把设置的UUID加入Devices注册列表

在Devices下添加.

###生成Profiles

在 Certificates, Identifiers & Profiles | iOS Apps | Provisioning Profiles | Development 下, 点击添加一个新的Profiles.

到"选择证书"页面时, 有一点要注意, 最好只选上刚刚生成的证书, 不要选择所有. 因为 "选择所有"在Keychain中已有别的证书下, 容易出现各种奇葩问题, 后面会有详细说明.

profile_add

最后, 把它下载下来, 双击添加到Xcode中.

profile_done

##配置到Xcode

xcode_profile_configure

至此, 一切OK!

可能遇到的错

如果你按上面的执行下来, 最后一编译应用发现还是不行, 报类似这种错,

cer_error_1

在XcodeOrganizer中也会显示出错:

cer_error_2

这错一般是由于证书不匹配, 要检查:

保证生成Profile时, 选择且只选择了一个证书;
保证Keyschain里没有重复的证书.