iOS数字签名证书
问题: 公钥 私钥是怎么产生和使用的?
根证书
根证书, 是CA给自己颁发的数字证书, 是信任链的起始点. 它一 般放在CA网站上, 供任何人下载.
数字签名原理
公私钥的特性:
1.对于一个私钥,有且只有一个与之对应的公钥。生成者负责生成私钥和公钥,并保存私钥,公开公钥
2.公钥是公开的,但不可能通过公钥反推出私钥,或者说*难反推,只能穷举,所以只要密钥足够长度,要通过穷举而得到私钥,几乎是不可能的
3.通过私钥加密的密文只能通过公钥解密,公钥加密的密文只有通过私钥解密
1.1 签名:
发送者先对要发送的”数据”计算一个哈希值, 再用自己的私钥对这个哈希值加密生成一 个”签名(值)”, 同时发送者要拥有一个向CA申请得到的”数字证书”( 其记录有公钥 ), *后发送者把”数据”, “签名(值)”和”数字证书”一起发送给接收者.
1.2 验证签名:
接收者接收到发来的”数据”, “签名(值)”和”数字证书”后, 会作一系列验证来判断这一数 字签名是否有效:
1.2.1
打开并验证”数字证书”的有效性;
1.2.2
计算”数据”的哈希值H1, 用”数字证书”记录的公钥对”签名(值)”进行解密得到值H2, 如 果H1==H2, 则该”数字签名”有效.
具体到
iOS证书签名
Apple官方提供的证书形式:
苹果公司目前提供两种 iOS Developer Program enrollment包括如下:
1. Standard Program
·$ 99 – 个人
– 此计划是为开发者能够自由地创造iPhone / iPod Touch/ iPad的商业应用,并且能够发布他们的应用程序在 App Store 上。
– 此计划每年有 100台 测试机器可以设置作开发以及测试用途。
– 这个程序不允许开发人员创建一个团队,团队成员添加到他们的帐户。
– 开发者参加这一计划将有各自的名称作为卖方在App商店上市。
·99美元 – 公司
– 公司应在邓白氏注册并拥有有效的 DUNS 号码。
– 此计划是对于希望开发iPhone / iPod Touch/ iPad的应用程序的 公司 而设。
– 此计划每年有 100台测试机器 可以设置作开发以及测试用途。
– 这个程序允许开发人员 创建一个团队, 团队成员添加到他们的帐户。
– 参加这一计划,其公司名称将作为卖方在App商店上市。
2.Enterprise Program
·$ 299 – 公司
– 公司应在邓白氏注册并拥有有效的 DUNS 号码。
此程序所开发的应用只能发给其雇员作 内部 使用。
– 这个程序允许开发人员 创建一个团队 ,团队成员添加到他们的帐户。
– 此计划将 不会允许 该公司在App商店出售他们的应用程序。
标红信息补充:
1. 各角色用户权限:
https://developer.apple.com/library/content/documentation/IDEs/Conceptual/AppDistributionGuide/ManagingYourTeam/ManagingYourTeam.html#//apple_ref/doc/uid/TP40012582-CH16-SW1
2. 注册DNUS: http://www.dnbchina.com
注册成功收到以下类似格式邮件:
Your D-U-N-S Number request/update submitted on 12/20/201x with ID Number xx’xxxx. You may start using your number in 14 days . D-U-N-S Number: xxxx Resolution Description: New Record CreatedThe following information was submitted as part of your request:Business Name: xxxxxxxx City: NJ City : CHINA PEOPLES REP Thank you for using D&B’s Mini Investigation Service.
证书生成过程
具体生成过程,目前资料较多,不再重复,对关键步骤解释:
1. 生成 CertificateSigningRequest.certSigningRequest ,生成这个同时钥匙串中会出现具体的公钥及私钥。
以上文件 包含信息:参考链接( https://en.wikipedia.org/wiki/Certificate_signing_request)
1.1 申请者信息,此信息是用申请者的私钥加密的
1.2 申请者公钥,此信息是申请者使用的私钥对应的公钥
2. 生成Certificate
2.1 公钥包含在证书CertificateSigningRequest.certSigningRequest中, 生成的这个东西叫 ios_development.cer
2.2 取出CertificateSigningRequest.certSigningRequest中的公钥,,然后将我的账号信息和我提交的公钥封装在证书中,并进行数字签名。
2.3 我的账号信息和我提交的公钥在certificate中
双击安装完证书后, KeyChain会自动将这对密钥关联起来(certificate只是关联私钥,并不包含)
3. 生成provisiontion profile
从生成步骤来看, ppfile包含了三个东西 AppID, UDID, 所信任的证书(cer)。
总结 ppfile包含的东西如下:
3.1 AppID。每个app必须在MC中创建一个对应的AppId, 里面包含一些功能列表。格式是your teamID.com.mt.xxx 。
3.2 证书。不同类型的证书就代表了不同的发布方式。
3.3 UDID 可安装的设备列表
3.4 AppID 包含的bundleID (生成这个之前需要生成AppId,可查看其它具体生成过程的资料)
3.5 证书里的个人信息和公钥
运行到真机:
1. 解压ipa
.app里面包含图标,entitlements, 二进制文件, mobileprovision等信息(iOS6以下,设置通用描述文件可以看到所有通过xcode或testflight等安装到真机上的ppfile. iOS8 手动同步安装ipa需在描述文件里信任证书)
2. 生成可运行真机的ipa.需要进行compile bitcode, codesign .app等过程
3. ipa跑到真机
公钥 被包含 在数字证书里,数字证书 又被包含 在描述文件(Provisioning Profile)中,描述文件在应用被安装的时候会 被拷贝 到 iOS 设备中。
3.1 App 在真机上启动时,需要对配置的 bundle ID、entitlements 和 certificate,设备是否在设备列表 与 Provisioning Profile 进行匹配校验。
3.2 从 合法 的 ios_development.cer 中获取 公钥 对 App 的可靠性和完整性进行校验。
总结2个问题:
1. 私钥签名 签的是什么东西?
executable code ,resources such as images and nib files aren’t signed 对应.app中的_CodeSignature文件夹下的 CodeResources
2. ios_development.cer 的合法性谁确定?
根证书(*后附有下载链接)
根证书就是一开始就被信任的证书,是信任链的起始点
Apple Root CA 证书公钥对其数字签名进行解密和校验。校验成功会标记此证书有效