尤里·阿克曼(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 联盟规范存储库

 

引用