WebAuthn使用AppId扩展无法识别已注册U2F安全密钥问题求助
U2F迁移WebAuthn时安全密钥未注册问题及解决
随着U2F API即将停用,开发者需要迁移到WebAuthn API,同时通过AppId扩展兼容此前通过U2F注册的安全密钥。按照官方文档完成配置后,身份验证时浏览器提示触碰安全密钥、密钥指示灯闪烁,但触碰后返回错误「您使用的安全密钥未在本站点注册」。对比现有U2F身份验证请求,使用的appid和key handle完全一致。
U2F签名请求示例:
{ "version": "U2F_V2", "challenge": "zSeDYPUjDVbLQ9HDle3g2QYrHEdG5vGBwAhzqdm_PAY", "appId": "https:\/\/subdomain.domain.net\/app-id.json", "keyHandle": "H-tBDjS1Fgr19cprKYUnZ9cDSE2AiX_Ld1kdPR2ruhIUbYr7jP3dflxkjZmfvqxkg5q84eXBr3ium3ETJ61Fww" }
返回给WebAuthn JS库的服务端响应示例:
{ "publicKey": { "challenge": "iygioh7vECe9OCQ5K0IBa0XeTD5hxX+aOBGimrJAntg=", "timeout": 60000, "rpId": "domain.net", "allowCredentials": [ { "type": "public-key", "id": "SC10QkRqUzFGZ3IxOWNwcktZVW5aOWNEU0UyQWlYX0xkMWtkUFIycnVoSVViWXI3alAzZGZseGtqWm1mdnF4a2c1cTg0ZVhCcjNpdW0zRVRKNjFGd3c=" } ], "userVerification": "discouraged", "extensions": { "appid": "https://subdomain.domain.net/app-id.json" } } }
上述credential id的base64 url解码结果为:
H-tBDjS1Fgr19cprKYUnZ9cDSE2AiX_Ld1kdPR2ruhIUbYr7jP3dflxkjZmfvqxkg5q84eXBr3ium3ETJ61Fww
已尝试的排查操作:
- 原U2F请求中的appid url做了转义处理,在WebAuthn版本中尝试过同样配置没有效果
- 尝试移除challenge和credential id末尾的填充字符
=,仍未解决问题
对接WebAuthn API的JS客户端会将challenge和credential id解码为二进制数组缓冲区,以下是传入navigator.credential.get API的publicKey参数的控制台日志:
{ "challenge": { "0": 83, "1": 195, "2": 81, "3": 9, "4": 32, "5": 53, "6": 59, "7": 244, "8": 34, "9": 113, "10": 189, "11": 177, "12": 61, "13": 184, "14": 170, "15": 86, "16": 43, "17": 206, "18": 102, "19": 145, "20": 218, "21": 136, "22": 137, "23": 18, "24": 14, "25": 176, "26": 210, "27": 54, "28": 201, "29": 57, "30": 156, "31": 21}, "timeout": 60000, "rpId": "domain.net", "allowCredentials": [ { "type": "public-key", "id": { "0": 72, "1": 45, "2": 116, "3": 66, "4": 68, "5": 106, "6": 83, "7": 49, "8": 70, "9": 103, "10": 114, "11": 49, "12": 57, "13": 99, "14": 112, "15": 114, "16": 75, "17": 89, "18": 85, "19": 110, "20": 90, "21": 57, "22": 99, "23": 68, "24": 83, "25": 69, "26": 50, "27": 65, "28": 105, "29": 88, "30": 95, "31": 76, "32": 100, "33": 49, "34": 107, "35": 100, "36": 80, "37": 82, "38": 50, "39": 114, "40": 117, "41": 104, "42": 73, "43": 85, "44": 98, "45": 89, "46": 114, "47": 55, "48": 106, "49": 80, "50": 51, "51": 100, "52": 102, "53": 108, "54": 120, "55": 107, "56": 106, "57": 90, "58": 109, "59": 102, "60": 118, "61": 113, "62": 120, "63": 107, "64": 103, "65": 53, "66": 113, "67": 56, "68": 52, "69": 101, "70": 88, "71": 66, "72": 114, "73": 51, "74": 105, "75": 117, "76": 109, "77": 51, "78": 69, "79": 84, "80": 74, "81": 54, "82": 49, "83": 70, "84": 119, "85": 119} } ], "userVerification": "discouraged", "extensions": { "appid": "https://subdomain.domain.net/app-id.json" } }
解决方案
该问题由多重编码导致,解决方案为将H-tBD...格式的原始keyHandle字符串先进行raw url base64解码后,再作为credential id返回给浏览器即可解决。
内容的提问来源于stack exchange,提问作者Phillip
相关产品推荐
相关产品推荐

