KRL(Key Revocation List)是OpenSSH专用的二进制密钥吊销机制,用于撤销SSH公钥或证书;而CRL(Certificate Revocation List)是OpenSSL基于X.509标准的文本/DER格式吊销列表,专用于PKI体系中的数字证书,二者格式、生成工具(ssh-keygen -k vs openssl ca -gencrl)、适用对象及协议栈均不兼容。

OpenSSH 的 KRL 是什么,和 OpenSSL 的 CRL 有什么区别
OpenSSH 不用 CRL(Certificate Revocation List),它用的是 KRL(Key Revocation List),这是 OpenSSH 自己定义的二进制格式吊销列表,专用于撤销 SSH 公钥(比如被盗的 id_rsa.pub)或证书。它不处理 X.509 证书,也不依赖 OpenSSL 的 openssl ca 命令。混淆这两者会导致配置失败——你用 openssl ca -gencrl 生成的 crl.pem 对 OpenSSH 完全无效。
生成 KRL 文件必须用 ssh-keygen -k
ssh-keygen -k 是唯一能生成合法 OpenSSH KRL 的命令。它不能读取文本序列号,只能基于已知公钥、证书或指纹来构建吊销项。
- 要吊销一个被盗的用户公钥:
ssh-keygen -k -f revoked.krl id_rsa.pub - 要吊销多个公钥:把所有待吊销的
.pub文件路径一次性列在命令末尾,如ssh-keygen -k -f revoked.krl alice.pub bob.pub - 要吊销某张 SSH 证书(
-s签发过的):ssh-keygen -k -f revoked.krl user_cert.pub - 如果只知道公钥指纹(比如日志里看到的
SHA256:xxx),得先用ssh-keygen -l -f key.pub核对,KRL 不支持直接按指纹写入
服务端启用 KRL 需改 sshd_config 并重载
仅生成 KRL 文件没用,sshd 必须明确加载它才生效。编辑 /etc/ssh/sshd_config,添加或修改这一行:
RevokedKeys /etc/ssh/revoked.krl
注意:
- 路径必须是绝对路径,且
sshd进程要有读权限(建议chown root:root /etc/ssh/revoked.krl && chmod 644 /etc/ssh/revoked.krl) - 不能写成
RevokedKeys ~/.ssh/revoked.krl——~在系统服务上下文中不展开 - 改完必须运行
sudo systemctl reload sshd(或sudo service ssh reload),restart会断开现有连接 - 吊销立即生效:被列在 KRL 中的密钥,下次尝试登录时会被拒绝,日志中出现
Authentication refused: bad ownership or modes for directory类错误通常是权限问题,不是 KRL 本身失效
KRL 没有自动更新机制,追加吊销要重建文件
OpenSSH 的 KRL 是不可追加的——ssh-keygen -k 每次都生成全新文件,不会合并旧内容。这意味着:
- 不能靠 “append” 方式持续添加新被盗密钥;必须保留所有曾被吊销的公钥文件,每次重建 KRL 时一并传入
- 推荐做法:建一个
/etc/ssh/revoked_keys/目录,把所有已吊销的.pub文件放进去,用脚本定期执行:ssh-keygen -k -f /etc/ssh/revoked.krl /etc/ssh/revoked_keys/*.pub - 没有类似 OpenSSL 的
crlnumber或自动时间戳,KRL 文件本身不含有效期,是否“过期”完全取决于管理员是否主动重建和重载
真正容易被忽略的是:KRL 只阻止密钥认证,不阻止密码登录;如果你没同时禁用密码登录(PasswordAuthentication no),攻击者仍可能绕过 KRL 用暴力破解密码入场。


















