如何使用数字签名来控制软件升级?

Posted

技术标签:

【中文标题】如何使用数字签名来控制软件升级?【英文标题】:How can I use a digital signature to control software upgrades? 【发布时间】:2017-07-10 16:57:35 【问题描述】:

我正在寻求一些关于如何最好地防止(或至少阻止)嵌入式系统上未经授权的软件升级的具体建议。它不需要是防弹的,我们现在可以假设系统本身已被充分锁定,因此任何人都无法获得未经授权的访问。

我的计划是基本上在系统上运行一个安装程序进程,该进程将从任何地方接收更新包,但在尝试安装它们之前可以确保这些包来自受信任的来源(即我)。

简而言之,更新包将有实际的安装包,加上一个只能由我自己生成的匹配数字签名。此外,签名将完全由自己生成,不涉及任何外部机构。

以下是我对可能流程的想法:

    生成私钥/公钥对,并将公钥与嵌入式系统本身一起分发。

    创建软件安装包时,使用我们的私钥通过签名生成器通过管道传输包的内容(或包的 MD5)。

    随该签名分发软件安装包。

    让安装程序根据软件安装包检查签名(使用它已有的公钥)并仅在匹配时安装。

如果有人发现此方案有任何问题,我将不胜感激,并提供有关如何避免这些问题的任何具体建议。此外(尽管这不是问题的主要目的),任何有关生成密钥的工具的建议都将不胜感激。

【问题讨论】:

【参考方案1】:

我认为您的解决方案没有任何明显的问题。我可以提出您可能已经考虑在内的改进建议

如果嵌入式软件被充分锁定,则无需采取额外措施来保护随软件分发的公钥的完整性(例如,通过对安装程序本身进行签名和混淆,这可能会让人头疼)

我考虑过使用 TLS 连接来下载更新,但实际上并不需要,因为软件包将受到数字签名的保护

我建议将公钥封装在 X509 证书中。通过这种方式,您可以控制有效期,甚至可以在私钥被泄露时进行撤销。在这种情况下,您将需要一个分层证书颁发机构,以及一个颁发签名证书的根证书。在安装程序的信任库中包含根证书的公共部分。然后在到期/撤销后使用不同的签名证书将对安装程序透明。

根证书的持续时间长且密钥大小较大(应该方便地保护),而签名证书的持续时间较短,可以使用较小的密钥。

如果您需要一些额外的服务,您还可以使用此 CA 生成 TLS 证书:例如检查可用更新。在这种情况下,将证书包含在安装程序的信任库中,以避免中间人攻击(SSL 固定)。

您可以签署完整的发行版或哈希。它不会影响安全性(请参阅https://crypto.stackexchange.com/questions/6335/is-signing-a-hash-instead-of-the-full-data-considered-secure)但不要使用 MD5,因为它具有广泛的漏洞。使用 SHA-2 函数。

要生成密钥,您可以在命令行中使用 openssl 或使用 GUI 应用程序 KeyStore-Explorer

【讨论】:

以上是关于如何使用数字签名来控制软件升级?的主要内容,如果未能解决你的问题,请参考以下文章

为什么你需要升级 pip

软件驱动数字经济发展 协同管理助推数字化升级

如何从OPENWRT固件上,用TFTP软件升级新版本OP

软件不能升级,使用USB下载固件后,更新软件查找不到升级文件,连提醒使用USB都没

随着企业的发展,管理软件也必然要升级,不知EABP企业管理软件是否也可以按企业的特点升级呢?

如何在 Linux 中使用一个命令升级所有软件