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

您如何实施平台许可证;“加密狗”;在Linux上使用TPM?,linux,openssl,tpm,Linux,Openssl,Tpm,我被要求为一个带有TPM芯片的x86_64设备使用TPM实现一个许可证加密狗。本质上,我们希望确保为设备发布的软件只能在设备本身上运行,这样,如果软件迁移到虚拟机或其他硬件,它将拒绝运行 我并不期望该解决方案能够抵抗逆向工程,而是一个典型的“加密狗”类型的解决方案,它将阻碍普通用户并保持企业客户的诚实 我已经成功地构建并包含了TPM模块,以及openssl TPM引擎代码-我可以成功地获得TPM的所有权,但除此之外,可用的文档并没有完全涵盖此用例-或者,如果有,我到目前为止还无法找到简单的英语解

我被要求为一个带有TPM芯片的x86_64设备使用TPM实现一个许可证加密狗。本质上,我们希望确保为设备发布的软件只能在设备本身上运行,这样,如果软件迁移到虚拟机或其他硬件,它将拒绝运行

我并不期望该解决方案能够抵抗逆向工程,而是一个典型的“加密狗”类型的解决方案,它将阻碍普通用户并保持企业客户的诚实

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

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


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

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

A.装运前:

  • 取得所有权-还创建存储根密钥(SRK)
  • 创建不可迁移的签名密钥
  • 将包装好的密钥存储在平台上的受信任密钥库中
  • 将所创建密钥的公钥存储在DB/文件系统/其他任何地方
  • B.准备申请:

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

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

    注意2:如果设备不是您自己安装的,您不能信任客户可能提供给您的公钥


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

    @A.2:因为我使用&而不是裤子,我不知道裤子包中是否包含用于创建密钥的命令行工具。但我确信它提供了正确的API。无论如何,例如jtt有一个命令
    create\u key
    ,它可以做到这一点。当你使用这个工具时,你会遇到一个问题,即密钥存储jTSS和裤子的e不兼容

    @A.3:不,除了存储根密钥(SRk)和认可密钥(EK)之外,TPM内部没有存储密钥。但是TPM保证属于TPM的密钥的任何私有部分都不会以未加密的格式出现在TPM之外。因此,您有一个密钥存储库,它以某种方式由受信任的软件堆栈(TSS->jTSS,等等)管理包含加密的密钥资料。TSS还负责在TPM中加载正确的密钥,然后再将其用于签名操作等


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

    我不完全理解您所说的“签名应用程序”是什么意思.据我所知,签名只是证明完整性,但不会以任何方式阻止未经授权的访问。因此我不明白重点…我希望实现的是证明二进制文件运行的硬件是“有效”硬件-如果硬件平台未知(不是签名链的一部分或它应该如何工作)二进制文件无法运行。显然,有人可以修改程序集,将JE更改为JNE,以反转行为,但这不是我试图阻止的。只是想使二进制文件迁移到不受支持的平台变得困难。您需要任何进一步的信息吗?我需要,我正在使用裤子来获取它,以便在不使用usi的情况下回答问题下载java工具包。当我完成文档编制后,我会接受您的回答。您的文档编制有什么进展吗?感谢您的简明回答-我添加了A/B/C标题以分解部分,因为我还有几个问题-我对裤子/TPM相当陌生,所以我提前道歉。我该如何完成(A.2.),这是我使用openssl做的事情吗?有可用的示例吗?(A.3.)这是TPM本身吗?对于(C*),你能给我举些例子吗?我抽象地理解要完成什么,但如果我能从中得到什么,那就太理想了。再次感谢你,至少我理解了讨论时要用到的词汇