在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完成认证。
操作误解纠正
- 错误直接对接/dev/tpm0:物理TPM才会映射到/dev/tpm0,虚拟TPM通过TCP socket提供服务,必须通过tpm2-abrmd桥接,不能直接指向/dev/tpm0。
- 缺少FIDO层配置:WebAuthn平台认证需要libfido2对接TPM,仅启动虚拟TPM和资源管理器不够,还需配置
FIDO2_TCTI环境变量让Firefox识别虚拟TPM为平台认证器。 - 权限问题:tpm2-abrmd需要以tss用户运行,udev规则要确保普通用户能访问虚拟FIDO设备,否则Firefox无法调用。
内容的提问来源于stack exchange,提问作者SaaHc2B
相关产品推荐
相关产品推荐

