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

syn*_*tel 5 linux openssl tpm

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

我不认为该解决方案可以抵抗逆向工程,而是一种典型的"加密狗"类型解决方案,它会阻碍普通用户并使企业客户保持诚实.

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

我希望尽可能依赖TPM中存储的私钥的秘密性质,而不是利用平台组件哈希(硬盘驱动器可能会死,CPU可能会被替换等等.我宁愿犯错客户端,以便在例行硬件升级后系统不会变得不可用.

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

Sco*_*tus 5

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

A. 发货前:

  1. 取得所有权 - 还创建存储根密钥 (SRK)
  2. 创建不可迁移的签名密钥
  3. 将包装好的密钥存储在平台上的可信密钥库中
  4. 将创建的密钥的公钥存储在您的数据库/文件系统/任何东西中

B. 准备申请:

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

C. 启动应用程序时:

  1. 创建一个随机数
  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 之前将正确的密钥加载到 TPM 中,例如用于签名操作。

@C*:应用端的加密部分是相当标准的。我不知道你在那个领域的知识如何。对于 TPM 部分,TSS 再次提供高级 API。我不知道是否有用于使用 TPM 进行签名的现有命令行工具。