使用TPM+证书的Openconnect VPN报PKCS#11对象不可用如何排查
问题定位操作步骤
1. 验证TPM硬件与驱动状态
- 检查TPM设备是否被系统正确识别,执行命令
ls /dev/tpm*,正常应该返回/dev/tpm0、/dev/tpmrm0类的设备节点 - 检查tpm2-abrmd服务是否正常运行:
systemctl status tpm2-abrmd,无异常的话服务状态应为active (running) - 验证TPM2工具链可用性:执行
tpm2_getcap properties-fixed,能正常返回TPM硬件参数代表底层驱动和硬件无故障
2. 验证PKCS#11模块与密钥对象状态
- 检查当前系统加载的PKCS#11模块列表,执行
p11-kit list-modules,确认TPM2对应的PKCS#11模块(通常是tpm2-pkcs11)已正确注册 - 列出TPM token内的所有对象,执行
p11tool --list-all --provider=/usr/lib/x86_64-linux-gnu/pkcs11/tpm2_pkcs11.so(路径根据系统架构、发行版实际安装路径调整),如果提示需要PIN解锁token,先输入正确的PIN,再检查返回结果中是否存在报错信息里提到的对象:对应需匹配的对象属性:token名为
XXXXX-TPM2-TOKEN、对象名XXXXX-RSA2048-keypair、id为0x3032的私钥对象 - 如果对象不存在,说明密钥对未正确导入到TPM的PKCS#11 token内,需重新完成密钥导入流程;如果对象存在,检查对象的访问权限,确认当前执行openconnect的用户是否有读取私钥的权限
3. 验证证书与密钥匹配性
- 先单独读取本地证书的公钥哈希:
openssl x509 -in /etc/pki/XXXX/XXXXX.crt -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 - 再读取TPM内私钥对应的公钥哈希:
p11tool --export-pubkey "pkcs11:model=SLB9670;manufacturer=Infineon;serial=0000000000000000;token=XXXXX-TPM2-TOKEN;id=%30%32;object=XXXXX-RSA2048-keypair;type=public" --provider=/usr/lib/x86_64-linux-gnu/pkcs11/tpm2_pkcs11.so | openssl pkey -pubin -outform der | openssl dgst -sha256 - 两者哈希不一致的话,说明本地证书和TPM内的私钥不匹配,需要替换为对应正确的证书文件
4. 验证Openconnect调用参数正确性
- 检查openconnect的启动参数,确认PKCS#11 URL的所有参数拼写无错误,包括token名、对象名、id值的转义是否正确
- 增加debug参数重新执行openconnect:
openconnect -v --cert /etc/pki/XXXX/XXXXX.crt --pkcs11-url='pkcs11:model=SLB9670;manufacturer=Infineon;serial=0000000000000000;token=XXXXX-TPM2-TOKEN;id=%30%32;object=XXXXX-RSA2048-keypair;type=private' YYYYY.com,查看debug日志中是否有更详细的PKCS#11调用错误,比如PIN码输入错误、对象访问被锁之类的额外提示
内容的提问来源于stack exchange,提问作者Maxim Panfilov
相关产品推荐
相关产品推荐

