如何在Linux上使用TPM实现平台许可证“加密狗”?

时间:2012-02-02 18:23:23

标签: linux openssl tpm

我被要求使用TPM为具有TPM芯片的x86_64设备实施多达许可证加密狗的功能。基本上所需要的是确保为设备发布的软件只能在设备上运行,这样如果软件迁移到虚拟机或不同的硬件,它将拒绝运行。

我认为该解决方案不具备逆向工程抗性,而是一种典型的“加密狗”类型解决方案,它会阻碍普通用户并使企业客户保持诚实。

我已经成功构建并包含了TPM模块,以及TrouSerS和openssl-tpm-engine代码 - 我可以成功获得TPM的所有权,但除此之外,可用的文档还没有完全覆盖这个用例 - 如果确实如此,我到目前为止还找不到简单的英语解决方案。

我希望尽可能依赖TPM中存储的私钥的秘密性质,而不是利用平台组件哈希(硬盘可能会死,CPU可能会被替换等等。我宁愿错误地站在客户一边,以便在例行硬件升级后系统不会变得无法使用。

同样,理想情况下我怀疑此解决方案可以设计为在制造过程中收集每个设备的公钥并将其添加到签名钥匙串中,以便可以针对每个设备可能存储的单个密钥对软件进行签名在TPM中,而不是要求多次签署软件?我可能会在这里弄错,但必须有一些满足平台认证方法的批量方法,否则看起来很难扩展。

1 个答案:

答案 0 :(得分:3)

如果您设置了设备,则可以遵循以下方案:

一个。发货前:

  1. 取得所有权 - 还会创建存储根密钥(SRK)
  2. 创建不可迁移的签名密钥
  3. 将包装的密钥存储在平台上的可信密钥库中
  4. 将创建的密钥的公钥存储在数据库/文件系统中的某个位置
  5. B中。准备申请:

    1. 您必须将公钥与应用程序的二进制文件一起发送
    2. 我不会将公钥编译为二进制文件,而是我更喜欢使用类似于只编译根CA公钥的CA系统。然后,可以将TPM签名密钥的公共部分作为证书文件发送。这样可以防止单独为每个设备编译二进制文件。
    3. ℃。启动应用程序时:

      1. 创建NONCE
      2. 让TPM签署NONCE
      3. 阅读证书并进行验证
      4. 从已验证的证书中提取公钥
      5. 使用获取的公钥验证TPM返回的签名(当然还要检查签名数据是否等于NONCE)
      6. 如果签名有效=> 你很高兴
      7. 注1:从理论的角度来看,这个解决方案是不安全的,因为可以修补二进制文件。你知道,所以这应该有效。

        注2:如果设备未由您自己设置,则您无法信任客户可能提供给您的公钥。


        编辑1:更准确地解释某些要点

        @ A.2:因为我使用jtt& jTSS而不是TrouSerS我不知道TrouSerS包中是否包含命令行工具来创建密钥。但我确信它提供了适当的API来实现。无论如何,jtt例如有一个命令create_key来执行此操作。当您使用此工具时,您将遇到jTSS和TrouSerS的密钥存储区与AFAIK不兼容的问题。

        @ A.3:不,除了存储根密钥(SRk)和认可密钥(EK)之外,TPM中没有密钥存储。但是TPM保证属于TPM的密钥的私有部分不会以未加密的格式出现在TPM之外。因此,您拥有一个密钥存储区,该密钥存储区由可信软件堆栈(TSS - > jTSS,TrouSerS)以某种方式管理,其中包含加密密钥材料。 TSS还负责在使用TPM之前加载正确的密钥,例如用于签名操作。

        @ C *:应用程序端的加密部分非常标准。我不知道你在那个领域的知识是怎样的。对于TPM部分,TSS再次提供高级API。我不知道是否存在用于与TPM签名的命令行工具。