Safari中crypto.importKey导入ECDH公钥报参数缺失错误求助
问题根因
这个报错是因为公钥导入时设置了错误的密钥用法(keyUsages)导致的。ECDH密钥协商场景下,deriveKey、deriveBits是仅私钥需要使用的权限,Firefox对用法校验比较宽松,即使公钥配置了这两个权限也能正常导入,但Safari会做严格校验:当检测到导入配置包含派生类权限时,会默认判定你要导入的是私钥,因此会强制校验私钥必备的d字段,公钥没有该字段就会抛出参数缺失错误。
修复方案
导入对方公钥时,将keyUsages参数设置为空数组即可,修改后的代码如下:
- JWK格式公钥导入:
crypto.subtle.importKey("jwk", jwkData, { name: 'ECDH', namedCurve : 'P-256' }, true, []).then(...)
- SPKI格式公钥导入:
crypto.subtle.importKey("spki", base64data, { name: 'ECDH', namedCurve : 'P-256' }, true, []).then(...)
补充说明
- 你自己的私钥导入逻辑不需要修改,保留原来的
["deriveKey", "deriveBits"]权限即可,私钥本身就需要用这两个权限完成密钥协商 - ECDH密钥协商的逻辑是使用己方私钥调用派生方法,对方公钥仅作为派生参数传入,因此公钥本身不需要配置任何操作权限,空usages完全符合W3C Web Crypto API的规范要求
- 修改后可以兼容所有支持Web Crypto API的浏览器,不会影响Firefox、Chrome等原有正常运行的环境
内容的提问来源于stack exchange,提问作者Kett Attila
相关产品推荐
相关产品推荐

