CodeSign的签名机制

简介: iOS如何保证App的安全

证书与密钥

我们从Apple Developer下载的证书,是CA(Certificate Authority)证书,证书中有公钥、有效期和认证机构信息(Apple Worldwide Developer Relations Certificate Authority)。

证书有两种,一种是iPhone Developer,一种是iPhone Distribution。前者用于App的测试开发,后者用于上传App到AppStore。

签名时通过命令行工具codesign来完成的,Xcode在构建完应用后会自动调用codesign对App进行签名(在Xcode > Build Settings > Signing 中设置求签名选项)。

签名可以对任何资源文件进行,在签名完成后,应用中会新建一个_CodeSignatue/CodeResources的文件,文件中存储了被签名的所有文件的签名。

# 签名
$ codesign -s '证书名称' XXX.app

# 重签名
$ codesign -f -s '证书名' XXX.app

# 获得app的签名情况
$ codesign -vv -d XXX.app

======
Executable=/Users/toto/Library/Developer/Xcode/DerivedData/Example-cfsbhbvmswdivqhekxfykvkpngkg/Build/Products/Debug-iphoneos/Example.app/Example
Identifier=ch.kollba.example
Format=bundle with Mach-O thin (arm64)
CodeDirectory v=20200 size=26663 flags=0x0(none) hashes=1324+5 location=embedded
Signature size=4336
Authority=iPhone Developer: Thomas Kollbach (7TPNXN7G6K)
Authority=Apple Worldwide Developer Relations Certification Authority
Authority=Apple Root CA
Signed Time=29.09.2014 22:29:07
Info.plist entries=33
TeamIdentifier=DZM8538E3E
Sealed Resources version=2 rules=4 files=120
Internal requirements count=1 size=184
======

# 验证签名情况
$ codesign --verify XXX.app

授权机制(Entitlements)

授权机制决定了系统资源在什么情况下可以被应用使用。简单地说就是沙盒的配置表,上面记录的是权限控制。

授权机制的配置是以plist文件格式保存的,xcode会将这个文件作为 --entitlements参数的内容传给codesign。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>application-identifier</key>
        <string>7TPNXN7G6K.ch.kollba.example</string>
        <key>aps-environment</key>
        <string>development</string>
        <key>com.apple.developer.team-identifier</key>
        <string>7TPNXN7G6K</string>
        <key>com.apple.developer.ubiquity-container-identifiers</key>
        <array>
                <string>7TPNXN7G6K.ch.kollba.example</string>
        </array>
        <key>com.apple.developer.ubiquity-kvstore-identifier</key>
        <string>7TPNXN7G6K.ch.kollba.example</string>
        <key>com.apple.security.application-groups</key>
        <array>
                <string>group.ch.kollba.example</string>
        </array>
        <key>get-task-allow</key>
        <true/>
</dict>
</plist>

可以在Xcode > Capabilities的选项中,设置需要开启的权限。当权限开启后,Xcode就会生成一段这样的XML,并生成一个.entitlements文件。

当构建App时,这个文件也会被codesign读取,作为应用授权的参考。这些授权都必须在Apple Developer相关联的App Id中开启,并包含在配置文件内。

可以用下面的形式查看App的签名信息中,包含了什么授权。

$ codesign -d --entitlements - XXX.app

配置文件(Provisioning Profiles)

配置文件将代码签名、沙盒和授权机制联系在一起。

配置文件中存放了系统用于判断App是否被允许运行,是否允许App在某个特定设备上运行等的信息。

配置文件可以让应用在开发设备上被运行和调试,也可以用于内部测试(Ad-Hoc)或者企业级App发布。Xcode会将项目设置的配置文件打包进应用内。

配置文件并不是一个plist,而是一个根据密码信息语法(Cryptographic Message Syntax)加密的文件。

可以用下面的命令来查看配置文件中的内容

$ security cms -D -i example.mobileprovision

参考资料

代码签名探析

目录
相关文章
|
Ubuntu
ubuntu 22.04 阿里源
ubuntu 22.04 阿里源
11759 0
|
Linux iOS开发 MacOS
typora下载和破解(仅供学习)
Typora 一款 Markdown 编辑器和阅读器 风格极简 / 多种主题 / 支持 macOS,Windows 及 Linux 实时预览 / 图片与文字 / 代码块 / 数学公式 / 图表 目录大纲 / 文件管理 / 导入与导出 ……
162919 11
typora下载和破解(仅供学习)
|
安全 Linux 网络安全
组网神器WireGuard安装与配置教程(超详细)
组网神器WireGuard安装与配置教程(超详细)
36654 2
|
Java Maven Android开发
Android 阿里云镜像整理
Android 阿里云镜像整理
7378 0
|
缓存 Linux 开发工具
CentOS 7- 配置阿里镜像源
阿里镜像官方地址http://mirrors.aliyun.com/ 1、点击官方提供的相应系统的帮助 :2、查看不同版本的系统操作: 下载源1、安装wget yum install -y wget2、下载CentOS 7的repo文件wget -O /etc/yum.
255401 0
|
数据安全/隐私保护 iOS开发 开发者
2022最新xcode打包IPA(完整详细图文)
2022最新xcode打包IPA(完整详细图文)
1962 0
2022最新xcode打包IPA(完整详细图文)
|
开发框架 监控 iOS开发
Flutter IOS 打包上架踩坑
Flutter IOS 打包上架踩坑
441 0
|
JavaScript
cnpm 的安装与使用
本文介绍了npm和cnpm的概念、安装nodejs的步骤,以及cnpm的安装和使用方法,提供了通过配置npm使用中国镜像源来加速包下载的替代方案,并说明了如何恢复npm默认仓库地址。
cnpm 的安装与使用
|
Web App开发 Ubuntu 安全
Linux中的certutil命令:处理证书与证书数据库的实用工具
`certutil`是Linux下的命令行工具,用于处理X.509证书和证书数据库,常与NSS库配合,服务于Firefox等应用。安装`certutil`可通过`apt-get install libnss3-tools`(Debian/Ubuntu)或`yum/dnf install nss-tools`(RHEL/Fedora/CentOS)。基本操作包括:使用`-L`列出证书数据库中的证书,`-A`添加证书,`-D`删除证书,`-x`导出证书。此外,还能用`-M`修改信任设置,`-C`列出证书链,`-V`验证证书链的有效性。了解这些功能有助于高效管理证书。
|
编译器 C语言 C++
C/C++编译优化技巧:预编译头文件(PCH)使用方法
C/C++编译优化技巧:预编译头文件(PCH)使用方法
1375 1