keygen元素已彻底失效,所有主流浏览器自2020年起移除支持,html living standard中完全删除;应使用web crypto api的generatekey()安全生成密钥对,并通过exportkey()提交公钥,私钥须设extractable: false。

keygen 元素已彻底失效,别再尝试修复它
所有主流浏览器(Chrome 80+、Firefox 69+、Edge 79+、Safari 一直未支持)自 2020 年起已移除 <keygen></keygen> 支持。你写的 <keygen name="pubkey" keytype="rsa"></keygen> 在现代页面中会静默降级为普通文本输入框,不生成密钥、不报错、也不触发任何事件——它只是个空标签。
这不是兼容性问题,而是标准层面的删除:HTML Living Standard 中已完全移除该元素,WHATWG 和 W3C 均标记为 obsolete。任何试图用 polyfill、CSS hack 或 JS 模拟它的方案,都无法还原其原生密钥生成与私钥安全存储行为。
用 Web Crypto API 替代 keygen 的最小可行实现
真正替代 <keygen></keygen> 的是 window.crypto.subtle.generateKey(),它能在 JS 中安全生成密钥对,并由开发者控制公钥提交逻辑和私钥使用边界。
- 必须用
crypto.getRandomValues()初始化熵源,不能依赖Math.random() - RSA 密钥需指定
modulusLength(推荐 2048 或 4096),ECDSA 推荐namedCurve: "P-256" - 生成后调用
exportKey("spki", publicKey)获取 PEM 或 DER 格式公钥,再转 base64 提交到表单 - 私钥必须保持
extractable: false(默认值),确保无法被 JS 导出——这是安全底线
示例关键片段:
async function generateAndSubmitPubKey() {
const keyPair = await crypto.subtle.generateKey("RSA-PSS", {
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256"
}, true, ["sign", "verify"]);
const pubKey = await crypto.subtle.exportKey("spki", keyPair.publicKey);
const pem = btoa(String.fromCharCode(...new Uint8Array(pubKey)));
document.getElementById("pubkey").value = `-----BEGIN PUBLIC KEY-----\n${pem.match(/.{1,64}/g).join("\n")}\n-----END PUBLIC KEY-----`;
}
表格布局里嵌入密钥生成控件的排版要点
在 HTML 表格中放置密码/密钥相关控件时,<table> 本身不是问题,但容易因结构僵化导致交互断裂。重点不是“怎么排”,而是“怎么不让浏览器自动填充干扰”。
<ul><li>避免在 <code><td> 中直接放 <code><input type="password">——浏览器可能误识别为登录字段并预填已有密码
autocomplete="new-password" 显式声明这是新密钥场景,而非改密或登录<td> 内,不要拆到不同行——否则 JS 绑定易失效
<li>若需显示公钥预览,用 <code><textarea readonly></textarea> 而非 <input>,防止移动端软键盘遮挡为什么你看到的“keygen 替代方案”大多不安全
很多教程用 Math.random() 拼接字符生成“密钥”,或把私钥存进 localStorage,这等于把保险柜钥匙贴在门上。真正的安全边界在于:
- 私钥绝不出浏览器内存,且不可被 JS 序列化(
extractable: false是硬约束) - 公钥提交必须走 HTTPS,且服务端要验证其格式(如 SPKI 结构)而非直接信任
- 密钥用途要绑定:生成时指定
["sign"]就不能用于加密,反之亦然 - WebAuthn 才是更优路径:用
navigator.credentials.create()调用硬件认证器,私钥根本不在 JS 环境里
表格只是容器,安全不在格子怎么画,而在每一行代码是否守住密钥生命周期的起点和终点。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











