codesign和spctl的区别

2023-01-12 11:14:53
标签: codesign adhoc spctl --deep

codesign用来签名和检查签名

1. 关于--options=runtime之前文章已经有介绍

2. 关于entitlements参数,这里暂时未发现entitlement和内容不符,会出问题,可能以后会有问题

我们签QtWebEngineCore.framework下面的Helpers下的QtWebEngineProcess.app时,用自己工程的entitlements替换了

QtWebEngineCore.framework/Versions/A/Helpers/QtWebEngineProcess.app/Contents/Resources/QtWebEngineProcess.entitlements

com.apple.security.cs.allow-unsigned-executable-memory

com.apple.security.cs.disable-library-validation

com.apple.security.cs.allow-jit

这里面的值和我们的不太一样,也没发现报错,特别是allow-jit删掉以后,也没发现报错。这是一个可疑的点,可能会有坑。

3. -dvvv和-vvv

-dvvv显示有没有签名,它不保险,显示有,但签名可能不合法

-vvv验证签名,它会检查签名,但是当签名是adhoc或者未认证帐号,它也会报正常。

所以这两个要结合用,昨天发现的问题就是-vvv不报错,是adhoc签名,在spctl的时候报错。

spctl用来验证app合法性,相当于验证守门员是不是工作,能不能过守门员的检查。

1. 它用来检查某个app合法性,当用在framework上时

conanchen@ConanChen client-delivery % spctl -a -v /Users/conanchen/client-delivery/Output/AppBundle/Test/Autodesk\ Fusion\ 360.app/Contents/Frameworks/Qt/QtWebEngineCore.framework

/Users/conanchen/client-delivery/Output/AppBundle/Test/Autodesk Fusion 360.app/Contents/Frameworks/Qt/QtWebEngineCore.framework: rejected (the code is valid but does not seem to be an app)

当应用在App时

onanchen@ConanChen client-delivery % spctl -v -a /Users/conanchen/client-delivery/Output/AppBundle/Test/Autodesk\ Fusion\ 360.app/Contents/Frameworks/Qt/QtWebEngineCore.framework/Versions/A/Helpers/QtWebEngineProcess.app

/Users/conanchen/client-delivery/Output/AppBundle/Test/Autodesk Fusion 360.app/Contents/Frameworks/Qt/QtWebEngineCore.framework/Versions/A/Helpers/QtWebEngineProcess.app: accepted

source=Developer ID

conanchen@ConanChen client-delivery % spctl -v -a /Users/conanchen/client-delivery/Output/AppBundle/Test/Autodesk\ Fusion\ 360.app/Contents/Frameworks/Qt/QtWebEngineCore.framework/Versions/A/Helpers/QtWebEngineProcess_debug.app

/Users/conanchen/client-delivery/Output/AppBundle/Test/Autodesk Fusion 360.app/Contents/Frameworks/Qt/QtWebEngineCore.framework/Versions/A/Helpers/QtWebEngineProcess_debug.app: rejected (the code is valid but does not seem to be an app)

可以看到,它能检查出是不是合规的app。它一般有括号,会报出问题,这种问题好解决。

项目遇到的问题就是它报rejected,但没有明确错误。一开始猜测是下面有其他app被rejected,它外层就rejected,最后实测它只考虑自己这个app,Nested的app需要

单独运行spctl -v -a来显示。像上面的QtWebEngineProcess_debug.app(spctl报错的)被包括的时候依然外层能被accepted。

项目中运用的是

spctl -vvvvvv --assess --type exec --continue pathofApp

当没有明确错误的时候,其实还是codesign的原因,因为我清楚前后只改了签名,但具体哪个不清楚。后来发现一个好方法。把怀疑的目录全删了,然后

codesign -f -s codesingIndentity --options=runtime --entitlements pathOfEntitlements pathofApp

再spctl -v -a pathofApp,当没有干扰项的时候,它应该报成功,然后慢慢从回收站put back。重复上面步骤,看哪个出错就是哪个有问题,再慢慢查。

最后发现的原因就是上面,用-vvv验证是成功的,但是-dvvv显示其实是adhoc的,也就是说spctl可以检查出adhoc的签名是不对的。

理论上签名在同一个app中应该可以不一样。

比如你用了第三方的库,只要库本身签名合法就行,外层你签上自己的签名就好。

特别注意上面检查步骤中codesign的时候没有--deep参数,因为如果加了--deep,它自动帮你解决所有问题,你不清楚--deep覆盖了哪些地方。

目前确定的是MacOS Frameworks (只有dylib, 其他不会覆盖) Helpers 应该还有Plugins,Resources会不会没有验证过。

所以这次目标就是去掉--deep参数,手动签名下面所有的依赖,最后在app上直接codesign不带--deep参数。

目前已经本地试成功了。

特别注明的是,不管codesign -vvv还是spctl它们只保证自己的检查正确,并不能保证过Notary,Notary的要求更高,需要所有的二进制都已经有合法签名。

在上面两步中,如果在一些特殊目录里,没有签名也是不报错的。


阅读(0) 收藏(0) 转载(0) 举报/Report
相关阅读

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有