You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Ubuntu 24.04上用虚拟TPM实现Firefox WebAuthn平台认证

需求与问题:Ubuntu 24.04 Firefox启用虚拟TPM实现WebAuthn平台认证

核心需求

  • 在Ubuntu 24.04系统的Firefox浏览器中,无需硬件TPM或独立安全密钥(如YubiKey),实现基于WebAuthn的平台认证
  • 验证标准:webauthn.me的浏览器支持页面中「平台认证器」项显示绿色对勾,浏览器不再提示插入安全密钥

已尝试操作

我曾尝试用swtpm搭建虚拟TPM栈对接FIDO功能,执行了以下命令:

sudo mkdir /tmp/mytpm2
sudo chown tss:root /tmp/mytpm2
sudo swtpm_setup --tpmstate /tmp/mytpm2 --create-ek-cert --create-platform-cert --tpm2
sudo swtpm socket --tpmstate dir=/tmp/mytpm2 --tpm2 --ctrl type=tcp,port=2322 --server type=tcp,port=2321 --flags not-need-init,startup-clear &
# 因为没配置资源管理器,tpm2-getrandom默认用/dev/tpmrm0,所以设置环境变量
export TPM2TOOLS_TCTI="device:/dev/tpm0"
# 验证是否正常工作
sudo -E tpm2_getrandom --hex 8

遇到的错误

执行后出现如下错误:

ERROR:tcti:src/tss2-tcti/tcti-device.c:504:Tss2_Tcti_Device_Init() timeout waiting for response from fd 3 
ERROR:sys:src/tss2-sys/api/Tss2_Sys_ExecuteFinish() Unsupported device. The device is a TPM 1.2

即使启动swtpm时加了--tpm2参数,错误依然存在。我曾尝试用tpm2-abrmd资源管理器将虚拟TPM状态文件连接到/dev/tpm0,但启动服务后错误依旧,执行手册示例命令也未解决问题。

诉求

需要完整的Shell命令步骤,在Linux中启用虚拟TPM并让Firefox识别,同时纠正我操作中的误解。我清楚该方案安全性弱于硬件TPM。


完整解决方案步骤

1. 安装依赖包

首先安装所有需要的工具:

sudo apt update && sudo apt install -y swtpm tpm2-tools tpm2-abrmd libfido2-dev udev

2. 配置虚拟TPM并启动

清理之前的残留状态,重新创建虚拟TPM环境:

# 停止可能运行的swtpm进程
sudo pkill swtpm
# 删除旧的TPM状态目录
sudo rm -rf /tmp/mytpm2
# 创建新的状态目录并设置权限
sudo mkdir -p /tmp/mytpm2
sudo chown tss:tss /tmp/mytpm2
# 初始化TPM 2.0状态
sudo swtpm_setup --tpmstate /tmp/mytpm2 --create-ek-cert --create-platform-cert --tpm2 --overwrite
# 启动swtpm socket服务(使用TPM 2.0)
sudo swtpm socket \
  --tpmstate dir=/tmp/mytpm2 \
  --tpm2 \
  --ctrl type=tcp,port=2322 \
  --server type=tcp,port=2321 \
  --flags not-need-init,startup-clear \
  --daemon

3. 配置并启动tpm2-abrmd资源管理器

虚拟TPM通过TCP socket提供服务,需要通过资源管理器桥接让系统工具和浏览器访问:

# 停止可能运行的tpm2-abrmd进程
sudo pkill tpm2-abrmd
# 设置环境变量,让tpm2-abrmd连接到swtpm的socket
export TPM2TOOLS_TCTI="tcp:host=127.0.0.1,port=2321"
# 启动tpm2-abrmd,绑定到虚拟TPM的socket
sudo -E tpm2-abrmd --tcti="$TPM2TOOLS_TCTI" --allow-root --daemon

4. 验证虚拟TPM功能

验证虚拟TPM是否正常工作:

# 设置TPM工具的TCTI连接
export TPM2TOOLS_TCTI="tabrmd:bus_name=com.intel.tss2.Tabrmd"
# 生成随机数验证
tpm2_getrandom --hex 8

如果能输出8位十六进制随机数,说明虚拟TPM正常运行。

5. 配置Firefox使用虚拟TPM作为平台认证器

Firefox需要通过libfido2访问TPM,需配置udev规则和环境变量:

# 创建udev规则,让系统识别虚拟TPM的FIDO接口
echo 'SUBSYSTEM=="hidraw", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", TAG+="uaccess"' | sudo tee /etc/udev/rules.d/99-virtual-fido.rules
# 重新加载udev规则
sudo udevadm control --reload-rules && sudo udevadm trigger

关闭所有Firefox进程后,用指定环境变量启动:

pkill firefox
# 配置libfido2使用虚拟TPM
export FIDO2_TCTI="tabrmd:bus_name=com.intel.tss2.Tabrmd"
firefox &

6. 验证WebAuthn功能

打开Firefox访问webauthn.me,查看「Platform Authenticator Support」项是否显示绿色对勾。此时尝试WebAuthn认证,浏览器应该不再提示插入安全密钥,直接使用虚拟TPM完成认证。

操作误解纠正

  1. 错误直接对接/dev/tpm0:物理TPM才会映射到/dev/tpm0,虚拟TPM通过TCP socket提供服务,必须通过tpm2-abrmd桥接,不能直接指向/dev/tpm0。
  2. 缺少FIDO层配置:WebAuthn平台认证需要libfido2对接TPM,仅启动虚拟TPM和资源管理器不够,还需配置FIDO2_TCTI环境变量让Firefox识别虚拟TPM为平台认证器。
  3. 权限问题:tpm2-abrmd需要以tss用户运行,udev规则要确保普通用户能访问虚拟FIDO设备,否则Firefox无法调用。

内容的提问来源于stack exchange,提问作者SaaHc2B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 18:46:13