如何使用命令行签名

一般而言,作为一个iOS或者MacOS的开发人员,目前已经不用怎么操心签名的事了,因为现在的Xcode版本已经集成了自动管理签名的功能。

但是有些时候,当出现签名问题的时候,我们还是需要能分析出来具体签名哪里出现问题了。也就是说,我们可以不必管签名的事,但是有问题的时候我们应当有解决问题的能力。那么如何查看签名信息,又如何使用命令行进行签名呢?

对于签名的管理,我们使用的命名是codesign

The codesign command is used to create, check, and display code signatures, as well as inquire into the dynamic status of signed code in the system.

codesign就是创建和管理证书的。下面列举一些基本的操作使用。

查看签名

比如我们看一下xcode的签名,我们使用 -d -v 参数,

-d 是display展示签名信息的意思,-v 是verbose的意思,越多的verbose显示信息越多,通常3个就已经足够了。

codesign -d -vvvv /Applications/Xcode.app
Executable=/Applications/Xcode.app/Contents/MacOS/Xcode
Identifier=com.apple.dt.Xcode
Format=app bundle with Mach-O thin (x86_64)
CodeDirectory v=20200 size=434 flags=0x2200(kill,library-validation) hashes=6+5 location=embedded
VersionPlatform=1
VersionMin=658688
VersionSDK=658944
Hash type=sha256 size=32
CandidateCDHash sha256=d60c658e651113198d9296d88528c5b1ee8e3031
Hash choices=sha256
Page size=4096
CDHash=d60c658e651113198d9296d88528c5b1ee8e3031
Signature size=4555
Authority=Apple Mac OS Application Signing
Authority=Apple Worldwide Developer Relations Certification Authority
Authority=Apple Root CA
Info.plist entries=39
TeamIdentifier=59GAB85EFG
Sealed Resources version=2 rules=13 files=253327
Internal requirements count=1 size=108

上面的签名中没有显示一些额外的信息,比如授权机制 entitements信息 。那么如何显示证书中的其他信息呢,在查看时使用 --entitlements 选项可以查看,比如:

codesign -d --entitlements - /Applications/Xcode.app 
Executable=/Applications/Xcode.app/Contents/MacOS/Xcode
??qq?<?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>com.apple.authkit.client.private</key>
    <true/>
    <key>com.apple.dt.simulator.client</key>
    <true/>
    <key>com.apple.private.tcc.allow</key>
    <array>
        <string>kTCCServiceAppleEvents</string>
    </array>
    <key>com.apple.private.coreservices.definesExtensionPoint</key>
    <true/>
    <key>com.apple.sysmond.client</key>
    <true/>
    <key>com.apple.developer.aps-environment</key>
    <string>production</string>
    <key>com.apple.PairingManager.Write</key>
    <true/>
    <key>com.apple.application-identifier</key>
    <string>59GAB85EFG.com.apple.dt.Xcode</string>
    <key>com.apple.developer.maps</key>
    <true/>
    <key>com.apple.PairingManager.Read</key>
    <true/>
    <key>com.apple.PairingManager.RemovePeer</key>
    <true/>
</dict>
</plist>                      

签名

签名使用codesign -s 命令,s就是签名sign的意思

签名需要一个证书,我们可以打开 钥匙串应用 查看我们拥有的证书,或者通过命令行使用security命令访问钥匙串,查找可以签名的证书,

security find-identity -v -p codesigning
  1) EB88A7CC8131ECABD0288D9E21F3BD2D9B22CA66 "iPhone Developer: 家树 黄 (F6MJ39N69F)"
     1 valid identities found

我的钥匙串中就有这么一个证书:"iPhone Developer: 家树 黄 (F6MJ39N69F)"

为了方便起见,我就创建一个my.app文件。创建文件可以使用 touch 命令

touch my.app

我们看下没有签名的样子

codesign -d -vvvv my.app
my.app: code object is not signed at all

然后签名的时候,指定此证书进行签名就可以了

codesign -s "iPhone Developer: 家树 黄 (F6MJ39N69F)" my.app

签名之后没有输出,说明签名正确。如果有错误,会输出错误的。

如果想要重新签名 那么需要加上-f参数,-f的意思是force的意思,如果没有这个参数,签名不会不替换,签名操作会失败。

codesign -f -s "iPhone Developer: 家树 黄 (F6MJ39N69F)" my.app 
my.app: replacing existing signature

修改签名参数

  • 修改Identifier

上述查看xcode的签名,我们看到苹果的Identifier是com.apple.dt.Xcode,我们签名时,也是可以指定标识符的。那么我们需要使用-i参数,

我们先看一下刚才的签名信息:

codesign -vvvv -d my.app 
Executable=/private/tmp/my.app
Identifier=my
Format=generic
CodeDirectory v=20200 size=130 flags=0x0(none) hashes=0+2 location=embedded
Hash type=sha256 size=32
CandidateCDHash sha1=76a18f48dafd3f1f4b8d7284ae0a84c1f7bc594f
CandidateCDHash sha256=c79a6b24c624b76d0c459ca7217fdf8507ca0714
Hash choices=sha1,sha256
Page size=none
CDHash=c79a6b24c624b76d0c459ca7217fdf8507ca0714
Signature size=4793
Authority=iPhone Developer: 家树 黄 (F6MJ39N69F)
Authority=Apple Worldwide Developer Relations Certification Authority
Authority=Apple Root CA
Signed Time=Jan 1, 2019 at 5:31:48 PM
Info.plist=not bound
TeamIdentifier=85GDEX4F59
Sealed Resources=none
Internal requirements count=1 size=164

修改Identifier参数

codesign -f -i com.hjs.my -s "iPhone Developer: 家树 黄 (F6MJ39N69F)" my.app
my.app: replacing existing signature

查看一下,标示符已经变更了

codesign --verbose=4 -d my.app 
Executable=/private/tmp/my.app
Identifier=com.hjs.my
Format=generic
CodeDirectory v=20200 size=138 flags=0x0(none) hashes=0+2 location=embedded
Hash type=sha256 size=32
CandidateCDHash sha1=96f563024ef9fed0e92efbd801308740b0eb7e36
CandidateCDHash sha256=d6beb44d3b54c234fcaeaca5337ebc590d472183
Hash choices=sha1,sha256
Page size=none
CDHash=d6beb44d3b54c234fcaeaca5337ebc590d472183
Signature size=4793
Authority=iPhone Developer: 家树 黄 (F6MJ39N69F)
Authority=Apple Worldwide Developer Relations Certification Authority
Authority=Apple Root CA
Signed Time=Jan 1, 2019 at 5:35:34 PM
Info.plist=not bound
TeamIdentifier=85GDEX4F59
Sealed Resources=none
Internal requirements count=1 size=172
  • 修改flag

    我们看到我们的flags=0x0(none),Xcode的flag是flags=0x2200

    那么如何修改flag呢?使用-o参数

    codesign -f -o 0x2200 -s  "iPhone Developer: 家树 黄 (F6MJ39N69F)" my.app
    my.app: replacing existing signature
    

    查看flag

    codesign -vvvv -d my.app 
    Executable=/private/tmp/my.app
    Identifier=my
    Format=generic
    CodeDirectory v=20200 size=130 flags=0x2200(kill,library-validation) hashes=0+2 location=embedded
    Hash type=sha256 size=32
    CandidateCDHash sha1=2fb37cbcdd9d95939ca5de6608b506f3adc37403
    CandidateCDHash sha256=f001e1c70f67c2ee7cdf4acaa3854e466150be3d
    Hash choices=sha1,sha256
    Page size=none
    CDHash=f001e1c70f67c2ee7cdf4acaa3854e466150be3d
    Signature size=4793
    Authority=iPhone Developer: 家树 黄 (F6MJ39N69F)
    Authority=Apple Worldwide Developer Relations Certification Authority
    Authority=Apple Root CA
    Signed Time=Jan 1, 2019 at 5:40:21 PM
    Info.plist=not bound
    TeamIdentifier=85GDEX4F59
    Sealed Resources=none
    Internal requirements count=1 size=164
    
  • 修改entitlements

签名时使用--entitlements参数即可。此处没有准备entitlements文件,不做示范了。使用方法参考上述例子。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容