笔记-iOS 签名机制

作者: 强子ly | 来源:发表于2022-04-05 13:39 被阅读0次

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

    他说如果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 签名机制

        本文链接:https://www.haomeiwen.com/subject/kfsslrtx.html