草庐IT

笔记-iOS 签名机制

强子ly 2023-03-28 原文

写这篇文章的开头是因为一个同事问了我一个问题,

他说如果iOS证书过期了,我们debug包就打不开了,那么appstore下载的包会怎么样呢?

关于证书的概念好像只有:从钥匙串生成CSR文件、上传到apple开发者中心、然后下一步、下一步、select...然后直接生成下载,过期了就重新配一下,感觉都知道又好像只知道这样的一个过程,直到翻了翻资料(李明杰底层原理(上)),才把证书、描述文件、签名...这些彻底弄明白了,如果你和我一样,只知道一个配置,那建议还是看一看这篇文章。

来源:底层原理(上)
学习路线
加密解密 -> 单项散列函数 -> 数字签名 -> 证书 -> iOS签名机制


一、关于加密

根据密码的类型分类:对称加密非对称加密

  • 对称加密:加密、解密使用相同的密钥
  • 非对称加密:加密、解密使用不同的密钥(公钥、私钥),也被称为公钥加密
  • 对称加密优缺点
优点:加密、解密速度快

缺点:不能很好地解决密钥配送问题
对称加密
  • 非对称加密特点、优缺点
特点
- 加密密钥:一般是公开的,因此该密钥称为公钥
- 解密密钥:由消息接收者自己保管,不能公开,因此称为私钥
- 公钥、私钥是一一对应的,不能单独生成

优点:能解决密钥配送问题

缺点:加密、解密速度慢

密钥配送
- 由消息的接受者,生成一对公钥、私钥
- 将公钥发给消息的发送者
- 消息的发送者使用公钥加密消息
非对称加密
  • 混合加密
- 将 ‘对称加密’ 和 ‘非对称加密’ 的优势相结合

优点
- 解决了 ‘非对称加密’ 速度慢的问题
- 通过 ‘非对称加密’ 解决了 ‘对称加密’ 的密钥配送问题

说白了就是
- 用 ‘对称加密’ 对传输数据进行加密;
- 用 ‘非对称加密’ 对 ‘对称加密’ 的密钥进行加密。

二、单向散列函数

单向散列函数,又被称为消息摘要函数(message digest function),哈希函数

  • 特点及作用
特点
- 根据任意长度的消息,计算出固定长度的散列值
- 计算速度快
- 消息不同,散列值也不同
- 具备单向性

作用:防止数据被篡改✨✨✨✨✨

说白了,就是不管对多长的内容进行计算,都能得到相同位数的一串数字,例:

MD5 ("123")                            = 202cb962ac59075b964b07152d234b70
MD5 ("123456789012345678901234567890") = a46857f0ecc21f0a06ea434b94d9cf1d

tips:可直接在Mac终端查看,使用该命令。
- md5 -s "xxxx"
  • 常见的几种单向散列函数
MD5、SHA-1、SHA-2、SHA-3等

三、数字签名(注意:这里与数字证书区别对待)

  • 消息发送者产生,别人无法伪造的一段数字串;(用私钥加密消息的散列值,生成的结果)
  • 同时也是对信息的发送者发送信息真实性的一个有效证明
如何能保证这个签名是消息发送者自己签的?
- 用消息发送者的私钥进行签名

如果有人篡改了文件内容或者签名内容,会是什么结果?
- 签名验证失败,证明内容会篡改

数字签名不能保证机密性?
- 数字签名的作用不是为了保证机密性,仅仅是为了能够识别内容有没有被篡改


数字签名的作用
- 确认消息的完整性
- 识别消息是否被篡改
- 防止消息发送人否认


数字签名无法解决的问题:中间人攻击,如果遭遇了中间人攻击,那么
- 公钥将是伪造的
- 数字签名将失效
数字签名的过程.png
数字签名的过程改进-I.png
数字签名的过程改进-II
中间人攻击-数字签名无法解决的问题.png

四、证书

利用CA的私钥,对其他人的公钥生成数字签名

作用:解决中间人攻击(避免公钥被拦截)✨✨✨

- 密码学中的证书,全称叫公钥证书(Public-key Certificate,PKC),跟驾驶证类似
- 里面有姓名、邮箱等个人信息,以及此人的公钥✨✨✨
- 并由认证机构(Certificate Authority,CA)施加数字签名✨✨✨

证书主要内容:个人信息、公钥、权威机构的数字签名

用自己的话说:
就是CA用自己的私钥对你的公钥进行认证,其他人用CA的公钥签名的合法性
证书.png
注册与下载.png

五、iOS签名机制

作用:保证安装到手机上的App都是经过Apple官方允许的

苹果充当了CA机构

不管是真机调试,还是发布APP,开发者都需要经过一系列复杂的步骤
- 生成CertificateSigningRequest.certSigningRequest文件
- 获得ios_development.cer\ios_distribution.cer证书文件
- 注册device、添加App ID
- 获得*.mobileprovision文件

对于真机调试,现在的Xcode已经自动帮开发者做了以上操作

思考
每一步的作用是什么?
.certSigningRequest、.cer、.mobileprovision文件究竟里面包含了什么?有何用处?
公钥、私钥持有者
签名机制流程图
  • 如果从AppStroe下载的,里面没有mobileprovision文件,只有 I 和 VII
解释
1、Mac设备的公钥
- 从钥匙串生成CSR文件,就是生成公钥的过程

2、生成证书
- 把公钥(CSR文件)上传到Apple后台
- 利用Apple后台的私钥,对Mac设备的公钥进行签名后的证书文件

3、mobileprovision描述文件生成
- 选择app id
- 选择devices

六、重签名

  • 查看codesign用法
man codesign
  • 重签名步骤
1、准备一个embedded.mobileprovision文件(必须是付费产生的,aphid、device一定要匹配),并放入app中
- 可以通过Xcode自动生成,然后在编译后的App包中找到
- 可以去开发者证书网站下载

2、从embedded.mobileprovision文件中提取出embedded.plist权限文件
- security cms -D -I embedded.mobileprovision > temp.plist
- /usr/libexec/PlistBuddy -x -c 'Print :Entitlement' temp.plist > embedded.plist

3、查看可用的证书(可以看到证书ID)
- security find-identity -v -p codesigning

4、对.app内部的动态库、AppExtension进行签名
- codesign -fs 证书ID xxx.dylib

5、对.app包进行签名
- codesign -fs 证书ID --entitlements entitlements.plist xxx.app
  • 过程
1、当前app的devices中不包含设备b
2、重新生成一个embedded.mobileprovision,包含设备b,
3、用步骤二中的embedded.mobileprovision替换步骤一种的embedded.mobileprovision
1、查看Mac中的可用证书及ID
2、从embedded.mobileprovision文件中提取出plist权限文件
3、转换成embedded.plist权限文件
4、将图3生成的embedded.plist文件与待签名的ipa放到一个文件夹进行签名

5、将文件夹压缩,修改类型为.ipa类型

重签名GUI工具

参考文章

有关笔记-iOS 签名机制的更多相关文章

  1. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  2. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  3. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  4. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  5. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  6. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

  7. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  8. ruby - 使用 S/MIME 在 Ruby 中对电子邮件进行数字签名 - 2

    Ruby中是否有一种方法可以使用S/MIME对电子邮件消息进行数字签名?我们的团队使用PKI,我们的用户习惯于期待重要消息的数字签名。我知道我可以调用openssl命令行工具:opensslsmime-sign-signer$CERT_FILE-passinpass:$CERT_PASS-in$UNSIGNED_MAIL-out$SIGNED_MAIL-certfile$CERT_CA_FILE-from'your'-to'recipients'-subject'TheSubject'但我希望利用Ruby解决方案。 最佳答案 我最终

  9. ruby - 为 IO::popen 拯救 "command not found" - 2

    当我将IO::popen与不存在的命令一起使用时,我在屏幕上打印了一条错误消息:irb>IO.popen"fakefake"#=>#irb>(irb):1:commandnotfound:fakefake有什么方法可以捕获此错误,以便我可以在脚本中进行检查? 最佳答案 是:升级到ruby​​1.9。如果您在1.9中运行它,则会引发Errno::ENOENT,您将能够拯救它。(编辑)这是在1.8中的一种hackish方式:error=IO.pipe$stderr.reopenerror[1]pipe=IO.popen'qwe'#

  10. ruby - IO::EAGAINWaitReadable:资源暂时不可用 - 读取会阻塞 - 2

    当我尝试使用“套接字”库中的方法“read_nonblock”时出现以下错误IO::EAGAINWaitReadable:Resourcetemporarilyunavailable-readwouldblock但是当我通过终端上的IRB尝试时它工作正常如何让它读取缓冲区? 最佳答案 IgetthefollowingerrorwhenItrytousethemethod"read_nonblock"fromthe"socket"library当缓冲区中的数据未准备好时,这是预期的行为。由于异常IO::EAGAINWaitReadab

随机推荐