Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 在Windows上签署OS X应用程序(无codesign)_Xcode_Macos_Code Signing_Codesign_Code Signing Certificate - Fatal编程技术网

Xcode 在Windows上签署OS X应用程序(无codesign)

Xcode 在Windows上签署OS X应用程序(无codesign),xcode,macos,code-signing,codesign,code-signing-certificate,Xcode,Macos,Code Signing,Codesign,Code Signing Certificate,我有Windows应用程序,可以在Wine下的OSX上运行。为方便起见,我想将该应用程序打包为OS X应用程序(基于WineBallerr的xxx.app文件夹的ZIP存档) 请注意,应用程序的主要可执行文件(由Info.plist的CFBundleExecutable标记定义)是一个shell脚本,而不是二进制文件 我想在应用程序上签名以通过OSX网关守卫。由于我的完整构建过程在Windows上运行(实际上我根本没有Mac),我需要在Windows上对其进行签名 我已经发现,对应用程序进行签名

我有Windows应用程序,可以在Wine下的OSX上运行。为方便起见,我想将该应用程序打包为OS X应用程序(基于WineBallerr的
xxx.app
文件夹的ZIP存档)

请注意,应用程序的主要可执行文件(由
Info.plist的
CFBundleExecutable
标记定义)是一个shell脚本,而不是二进制文件

我想在应用程序上签名以通过OSX网关守卫。由于我的完整构建过程在Windows上运行(实际上我根本没有Mac),我需要在Windows上对其进行签名

我已经发现,对应用程序进行签名会创建包含四个文件的
\u CodeSignature
文件夹:

code目录
代码要求
代码资源
代码签名
我没有找到任何描述这些文件内容的规范

通过实验,我发现
CodeResources
是一个XML文件,其中包含应用程序中所有文件的SHA-1哈希。我可以生成它

CodeRequirements
二进制文件的内容似乎是固定的。它似乎不会随着应用程序的内容而改变。请确认。这个文件有什么用

至于二进制文件
code目录
code签名
我没有任何线索

这两个文件都会随着应用程序内容的变化而变化。似乎任何应用程序文件更改(包括纯文本许可证文件)都会影响它们

code签名
显然包含签名。我可以在文件中看到有关代码签名证书的纯文本信息。是否有任何工具可以生成该文件?因为这是一个签名,它应该是相当标准的。尽管可能存在一些额外的二进制元数据,这会使生成更加困难。有人知道它具体写了什么吗?我可以想象它只对
CodeResources
文件进行签名,因为它描述了应用程序中的所有其他文件。或者它实际上是递归地对应用程序中的所有文件进行签名吗

本机OS X应用程序只有
CodeResources
。所以在
\u CodeSignature
中实际上没有签名。我想这是因为它们在主可执行二进制文件中嵌入了签名。请注意,我的[Windows]二进制文件(尽管上面提到的
Info.plist
没有直接引用它)是使用Windows
signtool.exe进行代码签名的。显然,即使没有引用,OS X也会将签名识别为
codesign-d-vvv xxx。app
输出包括有关证书的信息:

Executable=/Applications/WinSCP.app/Contents/MacOS/startwine
标识符=WinSCP
格式=与泛型绑定
CodeDirectory v=20100 size=135标志=0x0(无)哈希值=1+3位置=嵌入
哈希类型=sha1大小=20
CDHash=a1ef4f04b2c1b4b793788ce3ab9d7881528f3d95
签名大小=4867
权威=Martin Prikryl
授权=VeriSign 3级代码签名2010 CA
认证机构=VeriSign 3级公共主要认证机构-G5
签字时间=2014年4月23日23:51:18
Info.plist条目=14
密封资源版本=2个规则=12个文件=846
内部需求数量=2尺寸=136

令人困惑的是,它根本没有提到二进制名称。无论如何,这并不能让守门人高兴。注意:上面的测试是针对已经包含
代码资源
文件的应用程序运行的(这可能是
密封资源版本
所指的
规则
文件
计数与文件内容匹配)。

没有严格在Windows上签名,但是你有没有考虑过把远程桌面放进朋友的Mac或者在云端租一台Mac?似乎有相当合理的计划

可以省去很多麻烦。您真正需要访问的只是代码设计工具和终端


编辑:您仍然需要一个Apple开发者帐户来签署应用程序-Gatekeeper仅允许来自Apple颁发的开发者ID证书的签名。

我们已尝试使用
libsecurity\u codesigning
库的源代码对代码签名进行反向工程。虽然似乎可行,但仍然是太多的努力,所以我们考虑放弃。我们希望至少分享我们迄今为止的发现,以便其他人可以在此基础上继续努力

我们发现,当
codesign
找不到MachO二进制文件时,它会退回到
SecCodeSigner::Signer::signArchitectureAgnostic
中实现的“架构不可知”签名

关键步骤包括:

  • code目录
    文件生成。除文件头(包括目录版本)外,该目录还包括捆绑包各个部分的少量SHA-1哈希
  • CodeSignature
    文件生成。签名使用加密消息语法(CMS)格式对
    code目录
    文件进行签名。可以在任何平台上使用OpenSSL验证签名:

    openssl cms-验证-在代码签名中-通知DER
    -content CodeDirectory-noverify-out CodeDirectory.verified
    
    请注意,需要使用
    -noverify
    跳过证书验证,因为OpenSSL似乎不支持证书的“代码签名”目的

    OpenSSL应该能够使用以下命令创建CMS签名:

    opensslcms-sign-in-code目录-out-code签名
    -签名人证书.pem-外表DER
    
    但是OSX不接受这样的签名


我们没有进一步了解。

二进制文件是Mach-O格式的吗?你读过苹果的代码签名指南()吗?它至少回答了你的一些问题。@danielv谢谢你的链接。我以前确实看过,但现在再仔细阅读一遍。它证实了我的假设,即
code需求
本身不是签名的一部分,我应该主要关注
code目录
code签名
。不幸的是,没有对其结构的描述。顺便说一下,代码设计实用程序和代码设计库源代码是开放的,并且可用:-。以前试过,但我试过