我应该自己签署开源代码吗?


11

我使用macOS 10.14并尝试安装在Github上找到的Vim开源插件时遇到问题。我下载了源代码并自己进行了编译,效果很好,但是当我运行它时,由于“ [可执行文件的代码签名]无效而无法在进程中使用”,执行被中断了。

这给了我很多我无法解决的问题:

我既可以自己签名,也不会破坏代码签名的目的吗?从互联网上签名代码和在“此应用程序是从互联网上下载”对话框中允许身份不明的开发人员使用的应用程序在质量上有什么区别?

如果我不这样做,那么要签署谁的“责任”?仓库维护者?贡献者?苹果是否期望开源开发人员始终拥有Apple开发人员ID?还是我误解了代码签名的目的?

编辑:

为了明确起见,我的问题是我应该如何处理自己编译的未签名源代码,因为我不希望贡献者总是能够或记得对他们的代码进行签名,尤其是在涉及对开源项目的微小贡献时有很多贡献者。

Answers:


9

临时代码签名

对于您自己编译的,需要代码签名的第三方应用程序和二进制文件,请使用临时代码签名

  • 我假设没有签名就不会运行该应用程序;
  • 我假设该应用程序将不会分发;
  • 我假设您不关心签名的身份是否有效。

临时签名不能提供可靠的安全性。它可用于确定应用程序是否已更改,并可用于将安全性限制(例如权利)应用于应用程序。

临时签名将针对codesign而不是进行验证spctl。这可能会或可能不会重要,具体取决于要签名的二进制文件。对于应用程序和可执行文件,这不太重要,因为spctl它不在本地创建的二进制文件上运行。

为什么要进行代码签名?

关于提炼的问题:

我应该如何处理自己编译的未签名源代码,因为我不希望贡献者总是能够或记得对他们的代码进行签名,尤其是在涉及许多贡献者的开源项目中做出微薄贡献的时候。

对于大多数自编译应用程序,不需要代码签名。这假定您信任应用程序的代码。在macOS上,您可以从Finder打开不受信任的应用程序,请参阅Apple的“ 从身份不明的开发人员打开应用程序”

如果您不信任代码或开发人员,请不要编译或运行该应用程序。

您的责任

源代码提供者没有责任或义务提供预构建的代码签名的二进制文件。由于是自编译的,所有代码签名都是您的选择和责任。

  • Apple 要求提交到其App Store的提交必须经过代码签名。

  • 苹果要求其App Store之外的开发人员对他们的代码进行签名,但这不是必需的。

在这两种情况下,仅最终二进制文件被签名。原始源代码和资源未签名。

源代码未签名

对于macOS,不能以有意义的方式对源代码本身进行代码签名。源文件和代码可以像任何其他文件一样进行数字签名,但这不会影响macOS处理生成的应用程序或二进制文件的方式。

如何临时代码对Mac应用程序进行签名

要使用临时签名在macOS上对应用程序进行代码签名,请将身份-s标记设置为-

codesign --force -s - </path/to/application>

codesign命令的所有其他规则,要求和排列保持不变。

该标志--force在此处用于覆盖任何现有签名。

您可能需要将--deep标志添加到codesign命令以对子资源(例如框架和嵌入式服务)进行签名。


为什么您建议临时签名?您链接的答案指出“实际上创建临时签名的二进制文件仅对Apple开发人员具有实际价值”。
Wowfunhappy

这对我来说毫无意义。添加临时签名意味着签名验证将失败。这使您一无所获-程序将失败,并显示完全相同的错误消息。
jksoegaard

是的,我看到您删除了临时签名上我的答案的链接,并添加了假设。但是这些假设是否成立?-您似乎在回答问题,好像问题与运行应用程序有关。它不是。这是关于OP想要向其添加插件的已签名应用程序。也就是说,插件需要以原始签名的应用程序(Vim)为主机,通过库验证。
jksoegaard

原始问题已被编辑。它是相当广泛的。发问者可以评论,澄清并尝试这些答案,以查看对他们有用的方法。该答案试图回答已编辑的问题并提供实用的方法。如果这没有帮助,或者假设有误,发问者可以希望加入并阐明其意图。
格雷厄姆·米尔恩

1
这个答案很有帮助。我的问题很笼统,因为我发现苹果文档有些难以理解。使用临时签名解决了我遇到的特定问题。
Syntaxén

5

自己对程序进行签名并不会破坏代码签名的目的。代码签名的一般目的是使得可以验证该程序是未经修改的副本,该副本最初是由特定实体(个人或公司)创建的。当您自己签名程序以仅在计算机上运行时,系统可以检查创建二进制文件的确实是您自己,并且未被其他人修改。

自己对应用程序二进制文件进行签名与仅允许GateKeeper中身份不明的开发人员提供的应用程序之间在质量上的区别是,在前一种情况下,您允许运行一个特定的应用程序;而在后一种情况下,则允许您打开很多特定的应用程序只需右键单击不同的应用程序,然后选择“打开”即可。也就是说,通过自己签署特定程序,它的限制更加严格,因此也更加“安全”。

签名的责任完全是您的。开源开发人员无法对源代码进行签名-只能对已编译的二进制文件进行签名。当您自己生成已编译的二进制文件时,要对它们进行签名。

您可以在Apple网站上注册开发人员帐户,该帐户将允许您创建可用于签名的证书。如果您是开发人员并且定期编译二进制文件以在Mac上运行,则这是首选的处理方式。如果这是一次性的事情,您可能永远不会再做,那么执行此过程可能就太过分了。YMMV。

在此处针对您问题的其他答案建议您对二进制文件使用临时签名。这是行不通的。您需要生成一个有效的签名,才能使GateKeeper在其最安全的设置下运行二进制文件。


1

我应该自己签署开源代码吗?

如果您不是开发人员,那么不会。

简而言之,代码签名是一种可以让您(开发人员)说出自己是谁的方法,并且自从您上次签名以来,代码从未更改过。

从互联网上签名代码和在“此应用程序是从互联网上下载”对话框中允许身份不明的开发人员使用的应用程序在质量上有什么区别?

这听起来像是令人困惑的代码签名(开发人员在App Store上发布应用程序所需的代码签名)和Gatekeeper(保护Mac避免安装来自身份不明的开发人员的Mac软件)。

如果您允许Mac从App Store和指定的开发人员那里安装软件,您仍然会看到弹出窗口,提醒您软件已安装。

并且,如果它来自一个身份不明的开发人员,您将获得带有“警告图标”的相同弹出窗口

您仍然可以安装该软件。这只是一种机制,可以迫使用户进行交互以实际安装该软件,从而为您提供了针对自我安装的恶意软件的安全保护层。


谢谢,这回答了部分但不是全部问题。我已经编辑我的问题,试图更具体的要问什么,我
Syntaxén
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.