加载SSH密钥报错“Load key "/root/.ssh/id_ed25519": error in libcrypto”求助
问题描述
每次新机器启动时,从共享驱动器复制SSH密钥对到机器中,加载密钥时持续报错:
Load key "/root/.ssh/id_ed25519": error in libcrypto
但在新机器上重新生成密钥对就能正常使用。复制密钥是否存在限制?或是密钥与生成它的机器绑定?
背景:需要用该密钥访问GitHub私有仓库,执行的命令如下:
cp [共享驱动器上公钥路径] "/root/.ssh/id_ed25519.pub" cp [共享驱动器上私钥路径] "/root/.ssh/id_ed25519" ssh-keyscan -t ed25519 github.com >> ~/.ssh/known_hosts chmod go-rwx /root/.ssh/id_ed25519 git clone --filter=blob:none --no-checkout git@github.com:account/repo.git
对比复制的密钥与新生成的密钥内容完全一致,但新机器启动后复制的密钥无法使用,求排查原因。
排查步骤及解决方法
检查
.ssh目录权限
SSH不仅要求私钥文件权限为600(你已经设置了go-rwx),还要求.ssh目录权限必须是700(仅所有者可读写执行)。如果目录权限过松,SSH会拒绝加载密钥。执行以下命令检查并修复:# 查看目录权限 ls -ld /root/.ssh # 如果不是drwx------,修改权限 chmod 700 /root/.ssh排查换行符/编码问题
共享驱动器跨系统传输时,可能将私钥的换行符从Linux的LF转为Windows的CRLF,虽然内容看起来一致,但底层字节差异会导致libcrypto解析失败。用以下命令对比并修复:# 对比原密钥和复制后密钥的字节差异 diff -u [共享驱动器上私钥路径] /root/.ssh/id_ed25519 # 转换为Linux换行符 dos2unix /root/.ssh/id_ed25519验证密钥合法性与libcrypto版本兼容性
不同机器的OpenSSL/libcrypto版本差异可能导致密钥解析失败。先验证复制后的私钥是否合法:openssl ed25519 -in /root/.ssh/id_ed25519 -check如果验证失败,再对比生成密钥机器和新机器的OpenSSL版本:
openssl version若版本差异过大,尝试在新机器上重新导出原密钥(如果可能),或者升级/降级OpenSSL版本适配。
检查密钥文件隐性损坏
共享驱动器文件系统可能给密钥文件添加了不可见字符或空字节,导致解析错误。用cat -A查看所有字符:cat -A /root/.ssh/id_ed25519正常的Ed25519私钥应包含清晰的开头、结尾标记和中间Base64内容,无多余奇怪字符。若有,手动编辑删除。
排查安全模块限制
新机器的SELinux或AppArmor可能限制SSH读取复制的文件。临时关闭SELinux测试:setenforce 0如果测试有效,恢复SELinux并修复上下文:
setenforce 1 restorecon -Rv /root/.ssh
内容的提问来源于stack exchange,提问作者John Doe Python

