keygen标签从未用于“安全密钥生成”,它已被废弃且从不安全;其本意是辅助客户端证书注册,生成密钥对并提交公钥,私钥不出浏览器,但因实现不统一、密钥管理失控、无法审计及违背现代安全模型而被移除。

Keygen 标签从未用于“安全密钥生成”——它已被废弃且从不安全。
Keygen 标签的真实作用与设计意图
keygen 是 HTML5 早期草案中引入的一个表单控件,用于在客户端生成密钥对(公钥/私钥),并将公钥作为表单字段提交给服务器。其本意是辅助 Web 客户端证书注册流程(如向 CA 提交证书签名请求 CSR),而非通用密钥生成或加密操作。
它依赖浏览器内置的 PKI 支持(如 Mozilla 的 NSS 或旧版 IE 的 CryptoAPI),私钥由浏览器安全存储(如 Firefox 的软件令牌),但私钥始终不出浏览器环境,也不暴露给 JavaScript。
为何被移除:根本性安全与架构缺陷
- 缺乏标准化实现:Chrome、Firefox 实现差异大,Safari 从未支持,Edge 直接忽略
- 私钥管理不可控:浏览器未提供明确的密钥生命周期管理(如删除、导出、权限控制)
- 无法审计与验证:开发者无法确认密钥是否真由可信模块生成,也无法绑定设备或用户身份
- 与现代 Web 安全模型冲突:违背同源策略演进方向,且无法适配 Web Crypto API 的细粒度控制
替代方案:当前推荐的安全密钥实践
现代 Web 应使用 Web Crypto API 配合 Web Authentication API(WebAuthn):
- Web Crypto API:可在 JS 中安全生成、导出(需许可)、加密、签名(如 RSA-PSS、ECDSA)
- WebAuthn:通过平台认证器(如 Windows Hello、YubiKey、Touch ID)完成密钥生成与签名,私钥永不离开硬件
- 服务端应验证签名与 attestation 语句,而非信任前端提交的任意公钥
历史兼容性提醒
keygen 在 HTML5.2 草案中已被明确标记为过时(obsolete);HTML Living Standard 中已完全移除。所有主流浏览器自 2020 年起停止支持(Firefox 69+、Chrome 80+、Edge 79+)。任何仍在使用的 keygen 代码将静默失效或回退为普通文本输入框,不产生密钥,也不报错。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










