上周,使用惠普打印机的Mac用户无法打印或运行他们的打印机软件,因为惠普的代码签名证书被暂时吊销。在这篇博客文章中,我将从技术角度谈一谈这是如何工作的,并澄清一些关于这种情况的误解。在Mac App Store之外分发的软件(如惠普的打印机驱动程序)会使用开发者ID代码签名证书进行签名。此证书由苹果的开发者ID证书颁发机构(CA)颁发。还有一个不同的CA,苹果全球开发者关系认证机构(Apple Worldwide Developer Relations Certification Authority),用于Mac应用商店的开发。有关Apple证书和CA的信息可以在Apple PKI(公钥基础设施)页面上找到。您可以使用CoDesign命令行工具查看用于签署应用程序的证书。例如,如果您安装了我自己的应用程序StopTheNews,请使用以下命令:
这将在当前工作目录中创建文件cosign0、cosign1和cosign2。这些文件是DER(可分辨编码规则)格式,因此您可能希望为它们提供.der文件扩展名,这样您就可以使用QuickLook预览文件。这3个文件是组成信任链的3个代码签名证书。在StopTheNews的例子中,cosign0是我自己的开发人员ID应用程序证书,cosign1是开发人员ID CA证书,cosign2是Apple Root CA证书。后两个证书已经在您的系统根密钥链中,您可以在密钥链访问应用程序中看到这两个证书。
苹果的开发者ID CA没有证书吊销列表。开发者ID证书的吊销状态只能通过在线证书状态协议获得。CA的认证实践声明中对此进行了说明:
4.10.。证书状态开发者ID子CA利用在线证书状态协议(OCSP)提供证书是否已被吊销的信息。
这与Apple WWDR CA形成了鲜明对比,后者除了使用OCSP外还使用CRL:
4.10.。证书状态WWDR子CA使用两种方法进行证书验证,即证书吊销列表(CRL)和在线证书状态协议(OCSP)。
缺少开发人员ID CRL的一个不幸后果是,您无法获得所有被吊销的开发人员ID证书的列表。您只能逐个查询已知证书的状态。
启动开发者ID签名的应用程序时,它可能会执行OCSP检查。如果您跟踪数据包,就可以看到这一点。该检查包括一个HTTP GET请求(端口80,未加密!)。到ocsp.apple.com,其路径既是Base64编码的,也是URL编码的。根据OCSP格式,编码的字节以开发者ID证书的序列号结尾。OCSP检查由信任进程(/usr/libexec/trustd)执行。OCSP检查不同于公证检查,公证检查由syspolicyd进程执行。在公证存在之前,开发人员ID证书总是通过OCSP检查吊销。
OCSP结果会缓存一段时间,因此下次启动应用程序时,数据包跟踪可能不会显示另一项检查。在格式为/var/folders/[RANDOM]/C/com.apple.trustd/ocspcache.sqlite3的路径处,SQLite数据库中有一个OCSP缓存。在终端中输入命令getconf Darwin_USER_CACHE_DIR以获取Mac上的缓存目录。由于结果已缓存,因此证书的当前吊销状态可能不会反映在您的Mac上。
作为证书颁发机构,苹果可以随时撤销开发者ID证书。当苹果发现证书被用来签署恶意软件时,就会这样做。不幸的是,我们见过苹果错误地撤销开发者ID证书的案例,比如独立开发者查理·门罗(Charlie Monroe)。开发人员可以撤销他们自己的开发人员ID证书吗?答案是否定的。从开发者ID CA CPS:
4.8.。证书吊销订户可以通过发送电子邮件至[email protected]来发起吊销请求。随后,苹果将对撤销申请进行评估。
4.8.。根据内部商业惯例,在苹果授权员工的要求下,以苹果为目标订户的证书吊销证书将被吊销。对于PASS证书、增强PASS证书、Apple Pay PASS证书和网站推送通知证书,订户可以通过发送电子邮件至[email protected]发起撤销请求。随后,苹果将对撤销申请进行评估。对于颁发给开发者的所有其他证书,证书撤销过程将在收到订户通过Apple Developer网站或Xcode发出的撤销证书的有效请求后开始。订户将被要求使用他们的Apple ID和密码登录。身份验证后,订阅者将表明他们希望吊销证书。证书的吊销无法撤消。吊销后,必须申请新的证书。
政策上出现这种差异的原因是,撤销开发者ID证书会带来严重的后果,正如我们在惠普打印机软件中看到的那样:Mac用户将不能再运行用被撤销的证书签名的软件。开发者可以撤销他们自己的Mac App Store代码签名证书,因为这些证书只用于开发目的。从Mac应用商店下载的应用程序实际上并不是由应用程序开发者签名的,而是由苹果公司签名的。开发者只使用他们的Mac App Store证书来签署上传到App Store Connect的应用程序,或者在他们自己的Mac上本地测试该应用程序。因此,撤销开发证书对Mac App Store客户没有影响。如果你自己也是一名开发者,你可以去苹果开发者网站上的证书、识别符和配置文件,看看其中的不同之处。Mac(和iOS)App Store证书有一个可以按下的吊销按钮,而开发者ID证书没有吊销按钮。您必须向Apple Product Security发送电子邮件,要求撤销您的开发者ID证书。如果证书的私钥泄露,您可能会这样做。例如,这发生在恐慌中。(然而,苹果并没有撤销恐慌的开发者ID证书!他们的旧版应用程序仍在运行。)。
除非是恶意软件和泄露的私钥,否则真的没有什么好理由撤销开发者ID证书。每个代码签名证书都有一个有效期,但理解这意味着什么是至关重要的。代码签名证书的有效日期仅适用于使用该证书对软件进行签名。代码签名证书过期后,开发人员不能再使用该证书对软件进行签名。但是,除非证书被吊销,否则在到期日之前使用证书签名的任何软件都将永久有效。换句话说,到期日期适用于签名软件,而不适用于运行软件。只要他们的Mac上安装了有效签名的软件,用户应该始终能够运行该软件。
关于惠普打印机的情况,关于谁是罪魁祸首一直存在一些争议。以下是一份新闻声明:
The Register从知情人士那里了解到,惠普(HP Inc.)要求苹果吊销其打印机驱动程序代码签名证书。这一请求似乎适得其反,因为它让用户无法打印。惠普公司(HP Inc.)的一位发言人周五晚间告诉我们:
我们无意中吊销了一些较旧版本的Mac驱动程序的凭据。这对这些客户造成了暂时的中断,我们正在与苹果合作恢复驱动程序。同时,我们建议遇到此问题的用户卸载HP驱动程序,并使用本机AirPrint驱动程序打印到他们的打印机。
正如我的博客所说的那样,惠普不可能单方面撤销他们自己的开发者ID证书。惠普不得不联系苹果,要求撤销该证书。显然,苹果批准了这一请求。因此,责任必须分摊到这两家公司身上。目前还没有恶意软件或私钥泄露的报道。因此,惠普没有很好的理由要求撤销他们的证书,苹果也没有很好的理由同意这种误导性的请求。
强大的力量伴随着巨大的责任。惠普和苹果都没有尽到责任,Mac用户也因此蒙受了损失。