你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

用于 Azure IoT Edge for Linux on Windows 的 dTPM 访问权限

适用于:IoT Edge 1.4 复选标记 IoT Edge 1.4

受信任的平台模块 (TPM) 芯片是安全加密处理器,旨在执行加密操作。 此技术设计用于提供与基于硬件的安全性相关的功能。 Azure IoT Edge for Linux on Windows (EFLOW) 虚拟机没有附加到 VM 的虚拟 TPM。 但是,用户可以启用或禁用 TPM 直通功能,该功能允许 EFLOW 虚拟机使用 Windows 主机 OS TPM。 TPM 直通功能支持两个主要方案:

  • 使用 TPM 技术以便使用设备预配服务 (DPS) 预配 IoT Edge设备
  • 对存储在 TPM 中的加密密钥的只读访问。

本文介绍如何在 C# 中开发示例代码,以读取存储在设备 TPM 中的加密密钥。

重要

对 TPM 密钥的访问仅限于只读。 如果要将密钥写入 TPM,则需要从 Windows 主机 OS 执行此操作。

先决条件

  • 具有 TPM 或 vTPM 的 Windows 主机 OS(例如,使用 Windows 主机 OS 虚拟机)。

  • 启用了 TPM 直通的 EFLOW 虚拟机。 在权限提升的 PowerShell 会话中使用 Set-EflowVmFeature -feature "DpsTpm" -enable 来启用 TPM 直通。 有关详细信息,请参阅 Set-EflowVmFeature 以启用 TPM 直通

  • 确保 NV 索引(默认索引=3001)使用 8 个字节的数据进行初始化。 此示例使用的默认 AuthValue 为 {1,2,3,4,5,6,7,8},与写入 TPM 时 TSS.MSR 库中的 NV (Windows) 示例相对应。 从 EFLOW VM 读取之前,必须在 Windows 主机上执行所有索引初始化。 有关 TPM 示例的详细信息,请参阅 TSS.MSR

    警告

    启用到虚拟机的 TPM 直通可能会增加安全风险。

创建 dTPM 可执行文件

以下步骤演示如何创建示例可执行文件以从 EFLOW VM 访问 TPM 索引。 有关 EFLOW TPM 直通的详细信息,请参阅 Azure IoT Edge for Linux on Windows 安全性

  1. 打开 Visual Studio 2019 或 2022。

  2. 选择“创建新项目”。

  3. 在模板列表中选择“控制台应用”,然后选择“下一步”。

    Visual Studio 创建新解决方案

  4. 填写“项目名称”、“位置”和“解决方案名称”字段,然后选择“下一步”。

  5. 选择目标框架。 首选最新的 .NET 6.0 LTS 版本。 选择目标框架后,选择“创建”。 Visual Studio 创建新的控制台应用解决方案。

  6. 在“解决方案资源管理器”中,右键单击项目名称,然后选择“管理 NuGet 包”。

  7. 选择“浏览”,然后搜索 Microsoft.TSS。 有关此包的详细信息,请参阅 Microsoft.TSS

  8. 从列表中选择“Microsoft.TSS”包,然后选择“安装”。

    Visual Studio 添加 NuGet 包

  9. 编辑 Program.cs 文件,并将内容替换为 EFLOW TPM 示例代码 - Program.cs

  10. 选择“生成”>“生成解决方案”以生成此项目。 验证生成是否成功。

  11. 在“解决方案资源管理器”中右键单击项目,选择“发布”。

  12. 在“发布”向导中,选择“文件夹”>“文件夹”。 选择“浏览”并选择要生成的可执行文件的输出位置。 选择“完成”。 创建发布配置文件后,选择“关闭”。

  13. 在“发布”选项卡上,选择“显示所有设置”链接。 更改以下配置,然后选择“保存”。

    • 目标运行时:linux-x64。
    • 部署模式:自包含。

    发布选项

  14. 选择“发布”,然后等待创建可执行文件。

如果发布成功,应该会看到在输出文件夹中创建的新文件。

复制并运行可执行文件

创建可执行文件和依赖项文件后,需要将文件夹复制到 EFLOW 虚拟机。 以下步骤演示如何复制所有必要文件以及如何在 EFLOW 虚拟机中运行可执行文件。

  1. 使用“以管理员身份运行”启动提升的 PowerShell 会话。

  2. 将目录更改为包含已发布文件的父文件夹。 例如,如果已发布文件位于 C:\Users\User 目录中的文件夹 TPM 下。 可以使用以下命令更改为父文件夹。

    cd "C:\Users\User"
    
  3. 创建一个 tar 文件,其中包含前面步骤中创建的所有文件。 有关 PowerShell tar 支持的详细信息,请参阅 Tar 和 Curl Come to Windows。 例如,如果文件夹 TPM 下包含所有文件,可以使用以下命令创建 TPM.tar 文件。

     tar -cvzf TPM.tar ".\TPM"
    
  4. 成功创建 TPM.tar 文件后,使用 Copy-EflowVmFile cmdlet 将创建的 tar 文件复制到 EFLOW VM。 例如,如果目录 C:\Users\User 中有 tar 文件名 TPM.tar。 可以使用以下命令复制到 EFLOW VM。

    Copy-EflowVmFile -fromFile "C:\Users\User\TPM.tar" -toFile "/home/iotedge-user/" -pushFile
    
  5. 连接到 EFLOW 虚拟机。

    Connect-EflowVm
    
  6. 将目录切换到复制 tar 文件的文件夹,并检查该文件是否可用。 如果使用了上面的示例,则连接到 EFLOW VM 时,你已位于 iotedge-user 根文件夹。 运行命令 ls 列出文件和文件夹。

  7. 运行以下命令,从 tar 文件中提取所有内容。

    tar -xvzf TPM.tar
    
  8. 提取后,应会看到包含所有 TPM 文件的新文件夹。

  9. 将目录切换到 TPM 文件夹。

    cd TPM
    
  10. 向主可执行文件添加可执行权限。 例如,如果项目名称为 TPMRead,则主可执行文件名为 TPMRead。 运行以下命令,使其成为可执行文件。

    chmod +x TPMRead
    
  11. 若要解决 ICU 全球化问题,请运行以下命令。 例如,如果项目名称为 TPMTest,则运行:

     sed -i '/"configProperties": /a \\t"System.Globalization.Invariant\": true,' TPMTest.runtimeconfig.json
    
  12. 最后一步是运行可执行文件。 例如,如果项目名称为 TPMTest,请运行以下命令:

    ./TPMTest
    

    此时会看到类似下面的输出。

    EFLOW dTPM 输出

后续步骤