什么问题? 最近打开Cydia就闪退,我就重新去下载了uncOver,打算重新越狱一下,但是在重签名的时候一直失败,提示”No codesigning certificates found”的错误。
什么原因导致? 由于我之前使用iOS App Signer
这个MAC软件一直没有问题,今天遇到这个问题,我就想去github把源码克隆到本地,然后调试一下,看看具体是什么原因导致。 打开源码直接搜索No codesigning
发现,这个错误是一个Alert弹框,和我们遇到的弹框信息一致。
最终调试发现,在程序调用/usr/bin/security find-identity -v -p codesigning
命令时由于返回值为空,才触发错误弹框。
我把命令拷贝到终端执行,发现返回有效的identity的数量是0:
1 2 $ /usr/bin/security find-identity -v -p codesigning 0 valid identities found
此处的命令的意思是:
1 2 3 4 5 6 7 8 9 10 11 12 /usr/bin/security: A simple command line interface which lets you administer keychains, manipulate keys and certificates, and do just about anything the Security framework is capable of from the command line. (是一个管理钥匙串、keys和证书的命令行接口) find-identify: 查找证书和私钥key的命令 -v: 只显示有效的证书,默认显示所有的证书 -p: 指定策略
具体的命令行的文档查看一下:
1 2 3 4 5 6 7 8 9 10 11 $ /usr/bin/security find-identity --help find-identity: illegal option -- - Usage: find-identity [-p policy] [-s string] [-v] [keychain...] -p Specify policy to evaluate (multiple -p options are allowed) Supported policies: basic, ssl-client, ssl-server, smime, eap, ipsec, ichat, codesigning, sys-default, sys-kerberos-kdc, macappstore, appleID -s Specify optional policy-specific string (e.g. DNS hostname for SSL, or RFC822 email address for S/MIME) -v Show valid identities only (default is to show all identities) If no keychains are specified to search, the default search list is used. Find an identity (certificate + private key).
怎么解决? 由于使用/usr/bin/security find-identity -v -p codesigning
命令无法查询本地有效的重签名证书,我首先想到的就是更换查询策略,根据命令行文档可以看出,策略有很多种,包括basic, ssl-client ssl-server, smime, eap,ipsec, ichat, codesigning, sys-default, sys-kerberos-kdc, macappstore, appleID
。经过尝试,发现策略改成appleID
的时候是可以查询到有效证书的。但是这两个命令是有区别的。具体的区别如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 poet@poetdeMacBook-Pro ~ % /usr/bin/security find-identity -v -p codesigning 1) C766972EC48052D14E3A2D715F03960E10B4XXXX "Apple Development: Zhang San (MGRQJNV411)" 2) 8EA5E415105CEE96F75EAFA443B6AC992FC9CCCC "Apple Development: Li Si (SB6BFS5U22)" 3) AEF5450BA48F61EE1B5A718B7563D855E306DDDD "iPhone Developer: Zhang San (MGRQJNV433)" 3 valid identities found poet@poetdeMacBook-Pro ~ % /usr/bin/security find-identity -v -p appleID 1.2.840.113635.78.1.30 1) F87912EA9F939D6F044F1B86A165C5D8AC8CAAAA "com.apple.idms.appleid.prd.5675685073322f516b6a565a55775471374c72424b671234" (CSSMERR_TP_CERT_EXPIRED) 2) 8751799A43C85FEF3914DE664E2A05251F40BBBB "Mac Developer: Lao Wang (H2C8DTYK00)" (CSSMERR_TP_CERT_EXPIRED) 3) C766972EC48052D14E3A2D715F03960E10B4CCCC "Apple Development: Zhang San (MGRQJNV411)" (Missing required extension) 4) 8EA5E415105CEE96F75EAFA443B6AC992FC9DDDD "Apple Development: Li Si (SB6BFS5U22)" (Missing required extension) 5) AEF5450BA48F61EE1B5A718B7563D855E306EEEE "iPhone Developer: Zhang San (MGRQJNV433)" (Missing required extension) 5 valid identities found
经过上面的对比,发现策略是codesigning
的时候查询出来的是所有有效的重签名的证书,不包含其他的证书(比如:苹果的idms官方证书、MAC电脑的证书等),但是策略是appleID
的时候查询出来的证书一定包含策略codesigning
查询出来的证书。所以,当使用策略codesigning
无法查询出证书情况的时候,可以考虑把策略换成appleID
来查询。所以解决办法就是将codesigning
策略换成appleID
的策略。
提交Pull Request 解决这个问题之后,我去github仓库的issue里面看,发现很多人也有类似的问题,我就自己尝试提交了一个Pull Request
到作者的仓库,虽然作者很久没有更新了,但是如果后续还有人碰到此问题可以通过类似的办法解决。如何提交Pull Request
,我是参考github上的一个帖子,具体步骤如下:
如何在别人的开源项目中提交自己的Pull Request ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1.先在本地创建一个空文件夹,里面准备放克隆过来的代码. --> 我在本地Downloads文件夹下创建了一个名为 gitMessagekit 的文件夹. 2.在"终端" 中通过cd 命令进入到gitMessagekit文件夹下(将"自己电脑的用户名" 换成你自己的电脑的用户名). --> cd /Users/自己电脑的用户名/3.Downloads/gitMessagekit 3.在"终端" 输入克隆命令 git clone 开源项目源代码的url. --> git clone https://github.com/MessageKit/MessageKit.git 4.进入到克隆所在的文件夹. --> cd /Users/自己电脑的用户名/Downloads/gitMessagekit/MessageKit 5.用查看命令查看一下开源项目都有多少个分支. --> git branch -a 6.找到自己要切换的分支,准备切换分支,在这里我要切换到3.0.0-beta分支. --> git checkout remotes/origin/3.0.0-beta 7.基于远程分支新建本地分支(3.0.0-beta),2条命令. --> git branch 3.0.0-beta git checkout 3.0.0-beta 8.打开/Users/自己电脑的用户名/Downloads/gitMessagekit/MessageKit该路径下的代码,对代码进行修改. 9.添加修改. --> git add 你修改的文件 10.提交修改. --> git commit -m "fix 某某问题" 11.去自己的git仓库,准备fork一下开源项目MessageKit到自己的仓库(repository)中. 12.即将关联自己fork过的项目. --> git remote add upstream git@github.com:xxjldh/MessageKit.git 13.推送本地的分支(3.0.0-beta)到自己fork过的仓库中,2条命令. --> git fetch origin git merge origin/3.0.0-beta 14.在即将提交时出现这样一个错误,git@github.com: Permission denied (publickey).解决办法(https://www.jianshu.com/p/f22d02c7d943) 15.最后push自己的分支到自己fork过的仓库中. --> git push upstream 3.0.0-beta 16.在开源项目https://github.com/MessageKit/MessageKit.git的pull request中添加自己刚修改过的文件, 点"comment pull request" 即可.
下载链接 下载App重签名工具
参考链接 Mac Security工具使用总结 security命令 如何给开源项目贡献代码