如何在 Linux 上使用 TPM 实现平台许可证"dongle"?



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

我不希望该解决方案具有逆向工程抵抗性,而是一个典型的"加密狗"类型的解决方案,它会阻碍正常用户并让企业客户保持诚实。

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

如果可能的话,我更喜欢依赖TPM中存储的私钥的秘密性质,而不是利用平台组件哈希(硬盘可能会死,CPU可能会被替换,等等)。我宁愿站在客户一边犯错,这样系统在例行硬件升级后就不会变得不可用。

此外,理想情况下,我怀疑这个解决方案可以设计为在制造过程中收集每个设备的公钥并将其添加到签名密钥链中,这样就可以根据每个设备可能存储在TPM中的单个密钥对软件进行签名,而不是要求对软件进行多次签名?我在这里可能错了,但必须有一些批量的方法来满足平台身份验证方法,否则它似乎很难扩展。

如果设备是由您设置的,您可以遵循以下方案:

A。装运前:

  1. 取得所有权—还创建一个存储根密钥(SRK)
  2. 创建不可迁移的签名密钥
  3. 将封装的密钥存储在平台上的受信任密钥库中
  4. 将创建的密钥的公钥存储在DB/文件系统中的某个位置

B。准备应用程序:

  1. 您必须将公钥与应用程序的二进制文件一起发送
  2. 我不会将公钥编译为二进制,相反,我更喜欢使用类似CA系统的东西,其中只编译根CA公钥。TPM签名密钥的公共部分可以作为证书文件发送。这样可以防止单独编译每个设备的二进制文件

C。启动应用程序时:

  1. 创建NONCE
  2. 让TPM签署NONCE
  3. 读取证书并进行验证
  4. 从已验证的证书中提取公钥
  5. 使用获得的公钥验证TPM返回的签名(当然还要检查签名数据是否等于NONCE)
  6. 如果签名有效=>您很高兴

注意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进行签名的现有命令行工具。

相关内容

  • 没有找到相关文章

最新更新