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

参考资料

代码签名探析

目录
相关文章
|
6月前
|
JSON 小程序 数据安全/隐私保护
小程序动态调试-解密加密数据与签名校验
本文主要讲解微信小程序加密、验签的情况下如何进行动态调试已获取签名以及加密信息
|
Java Windows
签名验签工具
我们提供了一键生成RSA密钥工具。该工具也提供了签名及验签功能,可以演示针对支付宝开放平台接口的签名和验签流程。 WINDOWS版本下载地址:WINDOWS MAC OS版本下载地址:MAC_OSX 解压后,WINDOWS版本双击文件“RSA签名验签工具.bat”即可运行工具。
4309 0
|
3月前
|
存储 机器学习/深度学习 算法
聚合签名、门限签名、Multisigs 和多签名
该文章深入探讨了数字签名在区块链技术中的应用,并比较了聚合签名、门限签名和多签名三种方案的异同,同时介绍了MuSig2和FROST这两种旨在提高区块链平台多签名或门限签名效率的提案。
50 3
聚合签名、门限签名、Multisigs 和多签名
|
4月前
|
算法 数据安全/隐私保护 Python
数字签名是一种用于验证数据完整性和来源身份的技术。它基于公钥密码学,允许数据的发送方使用其私钥对数据进行签名,而接收方则可以使用发送方的公钥来验证签名的有效性。
数字签名是一种用于验证数据完整性和来源身份的技术。它基于公钥密码学,允许数据的发送方使用其私钥对数据进行签名,而接收方则可以使用发送方的公钥来验证签名的有效性。
|
存储
要实现服务端签名直传
要实现服务端签名直传
93 1
|
文字识别 安全 Java
阿里云请求签名Java实现
为保证API的安全调用,在调用API时阿里云会对每个API请求通过签名(Signature)进行身份验证。无论使用HTTP还是HTTPS协议提交请求,都需要在请求中包含签名信息。在使用阿里云文字识别ocr时,看到官网提供了Python的构造签名示例,此篇文章就以官网提供的参数以Java方式构造下签名
1360 1
阿里云请求签名Java实现
|
Java 程序员 数据安全/隐私保护
Java接口签名(Signature)实现方案
针对当前的系统开发一个对外开放的接口
|
数据安全/隐私保护
加密与签名的区别
加密与签名的区别
114 0
|
算法 安全 Java
Gradle(10)一篇文章看懂 v1/v2/v3 签名机制
Gradle(10)一篇文章看懂 v1/v2/v3 签名机制
854 0
Gradle(10)一篇文章看懂 v1/v2/v3 签名机制
|
存储 Java 开发工具
AndroidV1,V2,V3签名原理详解
AndroidV1,V2,V3签名原理详解
292 0
AndroidV1,V2,V3签名原理详解