尤里·阿克曼(Yuriy Ackermann),高级 FIDO联盟认证工程师

FIDO 联盟很高兴地宣布发布 FIDO U2F 1.2 版规范。

自前两个版本以来,进行了结构性更改、改进、更新和新的安全功能。 下面,我们详细介绍一下这些变化。 有关更改的摘要版本,请转到“FIDO U2F v1.2:更改概述”。

JS 接口

接口 u2f {

无效寄存器 (

DOMString
appId

序列<RegisterRequest>
register请求

序列<RegisteredKey>
registeredKeys

function(RegisterResponse 或 Error)
回调

可选无符号长? opt_timeoutSeconds

);

无效符号 (

DOMString
appId

DOMString 挑战,

序列<RegisteredKey>
registeredKeys

function(SignResponse 或 Error)
回调

可选无符号长? opt_timeoutSeconds

);

};

高级 JS API 已更新。 以前,您必须单独设置,每个”RegisterRequest“和”SignRequest“ appId 和质询。 在 JS API v1.2 中,appld 作为第一个参数传递 u2f.register

/* —– U2Fv1.0 —– */

let appId = “
https://example.com
”;

let registerRequests = […];

let signRequests = […];

for (let regReq of registerRequests) {

regReq.appId = appId;

}

for (let signReq of signRequests) {

signReq.appId = appId;

}

u2f.register(registerRequests, signRequests, () => {

})

/* —– U2Fv1.2—– */

let appId = “
https://example.com
”;

let registerRequests = […];

let signRequests = […];

u2f.register(appId, registerRequests, signRequests, () => {

})

重新定义 v1.2 的另一种方式是身份验证请求字典。 以前的字典类型为 ”SignRequest已替换为”RegisteredKey“字典。

/* —– U2Fv1.0 —– */

dictionary SignRequest { // OLD

DOMString 版本;

DOMString 挑战;

DOMString keyHandle;

DOMString appId;

};

/* —– U2Fv1.2 —– */

dictionary RegisteredKey { // 新建

DOMString 版本;

DOMString keyHandle;

运输? 运输;

DOM发送? appId;

};

通过此更改,质询已从字典中删除,现在是 u2f.sign 命令的第二个参数,第一个参数是 appId,与 u2f.register 命令相同。

/* —– U2Fv1.0 —– */

let appId = “
https://example.com
”;

let signRequests = […];

for (let regReq of registerRequests) {

regReq.appId = appId;

}

u2f.sign(signRequests, () => {

})

/* —– U2Fv1.2 —– */

let appId = “
https://example.com
”;

let challenge = “YJjw3jBh6RiMPKY0lMWq8GXm0Qap”;

let registeredKeys = […];

u2f.sign(appId, challenge, registeredKeys, () => {

})

为了向后兼容,客户端仍可以处理 SignRequest。 这同样适用于 RP,RP 可以继续处理 SignResponse

另一个附加功能是“传输“数组。 RP 可以向客户端指示哪个传输特定密钥句柄使用。 它通过使用 传输 枚举:

枚举传输 {

“bt”, // 经典蓝牙(蓝牙 BR/EDR)

“ble”, // 低功耗蓝牙(Bluetooth Smart)

“NFC”, // 近场通信

“usb”, // USB HID

“usb-internal” // 不可拆卸的 USB HID(内置)

};

这对于 UI/UX 特别有用,在 UI/UX 中,客户端可以引用指示的传输指定的提示。

我们将在“身份验证器传输扩展”部分讨论传输检测。

MessagePort API 获得了自己的请求定义字典 IDL。

字典 U2fRequest {

DOMString 类型;

DOM发送? appId;

未签名的长? timeoutSeconds;

未签名的长? requestId;

};

这扩展到“U2fRegisterRequest和“U2fSignRequest

字典 U2fRegisterRequest
U2fRequest
{

DOMString 类型 = ‘u2f_register_request’;

序列<RegisterRequest> registerRequests;

序列<RegisteredKey> registeredKeys;

};

字典 U2fSignRequest


U2fRequest

{

DOMString

类型
= ‘u2f_sign_request’;

DOMString 挑战;

序列<
注册密钥

>


registeredKeys
;

};

正如你所看到的,U2F JS API 发生的变化也相应地发生在 MessagePort API 上。

/* —– U2Fv1.0 —– */

var port = <以浏览器特定的方式>获取 U2F MessagePort;

port.addEventListener(’消息’, responseHandler);

port.postMessage({

‘type’: ‘u2f_register_request’,

‘registerRequests’: [<RegisterRequest 实例>, …],

‘signRequests’: [<已知令牌 1> 的 SignRequest, …],

‘timeoutSeconds’:30,

‘requestId’: <unique integer> // 可选

});

/* —– U2Fv1.2 —– */

var port = <以浏览器特定的方式>获取 U2F MessagePort;

port.addEventListener(’消息’, responseHandler);

port.postMessage({

‘type’: ‘u2f_register_request’,

“appId”: <应用程序 ID>、

‘registerRequests’: [<RegisterRequest 实例>, …],

‘registeredKeys’: [<已知令牌 1> 的 registeredKey, …],

‘timeoutSeconds’:30,

‘requestId’: <unique integer> // 可选

});]

身份验证器传输扩展

在注册期间,身份验证器使用批处理密钥对质询进行签名,并为其公钥提供 X.509 证书。 供应商现在可以添加 X.509 FIDO OID 和 U2F 证书扩展,用于标识这是 U2F 身份验证器证书:

— FIDO联盟的OID

id-fido 对象标识符::= 1.3.6.1.4.1.45724

— FIDO U2F 协议 OID

id-fido-u2f 对象标识符 ::= { id-fido 2 }

— FIDO U2F 证书扩展弧

id-fido-u2f-ce 对象标识符 ::= { id-fido-u2f 1 }

为了标识身份验证器的类型,该规范定义了 U2F 传输扩展

— FIDO U2F 证书扩展

id-fido-u2f-ce-transports 对象标识符 ::= { id-fido-u2f-ce 1 }

fidoU2FTransports 扩展 ::= {

WITH 语法 FIDOU2FTransports ID id-fido-u2f-ce-transports

}

FIDOU2FTransports ::= 位字符串 {

蓝牙收音机(0),– 蓝牙经典

蓝牙低功耗收音机(1),

uSB(2),

nFC(3),

uSB内部(4)

}

原始消息格式

此更新最重要的功能之一是添加了静默身份验证器支持。 有了这个功能, 应用程序协议数据单元APDU 收到新的签名参数 don’t-enforce-user-presence-and-sign(0x08) . 现在,客户端可以在不强制执行用户状态的情况下请求签名。 这对于将静默模式用于“持有者令牌”(如身份验证模式)的基于 FIDO 的联合解决方案特别有用。 基于 FIDO 的解决方案的主要优势是泄漏恢复能力。 由于 FIDO 协议基于数字签名,并且私钥通常存储在安全飞地中,因此联合身份可以将身份验证器用作不可恢复的持有者令牌,因此不必担心客户端的 XSS 和恶意软件。

U2FHID系列

U2FHID 已更新为U2FHID_LOCK 命令。 现在,客户端可以请求身份验证器仅将通信锁定到一个通道长达 10 秒。 客户端可以连续发送 LOCK 命令以延长身份验证器锁定时间。

元数据语句

U2F 已获得对元数据语句的支持。

{

“description”: “FIDO 联盟示例 U2F 身份验证器”,

“证明证书KeyIdentifiers”: [“7c0903708b87115b0b422def3138c3c864e44573”],

“协议家族”: “u2f”,

“authenticatorVersion”:2,

“UPV”:[

{ “主要”: 1, “次要”: 2 }

],

“断言方案”: “U2FV1BIN”,

“authenticationAlgorithm”:1,

“publicKeyAlgAndEncoding”:256,

“证明类型”: [15879],

“userVerificationDetails”:[

[{ “用户验证”: 1 }]

],

“keyProtection”:10,

“matcherProtection”:4,

“attachmentHint”:2,

“isSecondFactorOnly”: “真”,

“tcDisplay”:0,

“证明根证书”:[

“MIICPTCCAeOgAwIBAgIJAOuexvU3Oy2wMAoGCCqGS

VdLIgtfsbDSu7ErJfzr4AiBqoYCZf0+zI55aQeAHjI…

lQ==”

],

“图标”: “BM10”

}

为了适应这些更改,添加了新字段,例如

  • attestationCertificateKeyIdentifiers — 来自 RFC5280 的 SHA-1 证书 SKID
  • assertionScheme —新的U2FV1BIN方案定义

通过这些更改,现在可以将 U2F 添加到元数据服务协议支持的列表中。

— — — — — — — — — — — — — — — — — — — — — — — — — — — — —

如果您想了解有关 U2Fv1.2 的更多信息,请访问

FIDO 联盟规范存储库

 

引用

 


Subscribe to the FIDO newsletter

Stay Connected, Stay Engaged

Receive the latest news, events, research and implementation guidance from the FIDO Alliance. Learn about digital identity and fast, phishing-resistant authentication with passkeys.