标签已被所有主流浏览器彻底移除,HTML标准标记为obsolete;因其私钥存储无规范、公钥传输无加密、密钥用途模糊三大硬伤被废弃,推荐用Web Cryptography API或WebAuthn替代。
不能用了。截至 2026 年初, 标签已被所有主流浏览器(Chrome、Firefox、Edge、Safari)彻底移除,HTML 标准也早在 HTML5.2 起将其标记为“obsolete”。你写 ,浏览器会直接忽略它——既不渲染控件,也不生成密钥,更不会在表单提交时附带任何公钥字段。
它不是“被替代”,而是“因设计缺陷被放弃”:
提交的公钥是明文嵌入表单的,若页面未启用 HTTPS,攻击者可直接篡改或劫持公钥(即“中间人替换公钥”)用 window.crypto.subtle 在前端安全生成密钥对,并
手动提交公钥(如 PEM 格式),是目前唯一被 W3C 标准支持、且浏览器广泛兼容的路径:
async function generateAndSubmitPubKey() {
const keyPair = await crypto.subtle.generateKey('RSA-OAEP', true, ['encrypt', 'decrypt']);
const publicKey = await crypto.subtle.exportKey('spki', keyPair.publicKey);
const pem = btoa(String.fromCharCode(...new Uint8Array(publicKey)))
.replace(/.{64}/g, '$&\n')
.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
// 提交到服务器,例如通过 fetch
await fetch('/api/register-key', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ pubkey_pem: `-----BEGIN PUBLIC KEY-----\n${pem}\n-----END PUBLIC KEY-----` })
});
}
注意点:
crypto.subtle 会抛 SecurityError
exportKey('jwk') 直接暴露私钥;私钥始终设为 extractable: false
crypto.createPublicKey())解析验证如果你的真实目标是“强身份认证”,别再纠结“生成密钥对”这个动作本身——WebAuthn 已经把整个流程标准化了:
一句话:keygen 想做但没做成的事,WebAuthn 用硬件+协议+API 全做了。现在新项目还手写 RSA 密钥生成逻辑,就像还在用 document.write 写页面一样,属于明知有更好选择却主动绕路。