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

时间:2017-02-21 07:25:26

标签: digital-signature software-update

我就如何最好地防止(或至少阻止)嵌入式系统上未经授权的软件升级提出了一些具体建议。它不需要防弹,我们现在可以假设系统本身已被充分锁定,以便没有人可以未经授权访问它。

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

以简单的形式,更新包将包含实际的安装包,以及只能由我自己生成的匹配数字签名。此外,签名纯粹是自我生成的,不涉及外部机构。

所以这些是我对可能过程的看法:

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

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

  3. 将软件安装包与该签名一起分发。

  4. 让安装程序根据软件安装包检查签名(使用已有的公钥),只有在匹配时才安装。

  5. 如果有人能发现这个计划有任何问题,我会很感激细节,以及有关如何避免这些细节的具体建议。此外(尽管这不是问题的主要目的),任何有关生成密钥的工具的建议都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

我认为您的解决方案没有明显问题。我可以建议你可能已经考虑过的改进

如果嵌入式软件被充分锁定,则无需采取额外措施来保护随软件一起分发的公钥的完整性(例如,通过签署安装程序本身并进行模糊处理,这可能会令人头疼)

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

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

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

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

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

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