centos7 设置ssh_key 无密码互信建立

本文详细介绍了如何在两个用户之间通过SSH协议复制公钥,实现无密码登录。具体步骤包括使用ssh-copy-id命令从源用户向目标用户传输公钥,并解决权限问题。

建立公钥私钥,分别创建两个用户zhw与zhw2.

1.将zhw中生成的公钥(id_ras.pub)拷贝到zhw2中

[zhw@localhost ~]$ ssh-copy-id -i .ssh/id_rsa.pub zhw2@192.168.163.122 -p 4                                                               4444

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for zhw:
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_rsa.pub"
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out                                                                any that are already installed
/bin/ssh-copy-id: INFO: 2 key(s) remain to be installed -- if you are prompted n                                                               ow it is to install the new keys
zhw2@192.168.163.122's password:

Number of key(s) added: 2

Now try logging into the machine, with:   "ssh -p '44444' 'zhw2@192.168.163.122'                                                               "
and check to make sure that only the key(s) you wanted were added.

2.将zhw2中生成的公钥(id_ras.pub)按步骤1拷贝到zhw1中

 

 

遇到问题

提示

/usr/bin/ssh-copy-id: ERROR: failed to open ID file '.ssh/id_rsa.pub': Permission denied

没权限,加sudo

[zhw@localhost ~]$ sudo ssh-copy-id -i .ssh/id_rsa zhw2@192.168.163.122 -p 44444

 

如果还需要输入密码,检查本用户下.ssh下文件的所属,可能被root了。

$ sudo chown user /home/user/.ssh/id_rsa

$ sudo chgrp user /home/user/.ssh/id_rsa

<think>我们正在解决SSH互信相关的三个错误: 1. `ssh-agent has no private key` 2. `failed to encrypt passphrase` 3. `failed to register ssh key` 首先,我们需要理解这些错误通常发生在SSH密钥管理过程中,涉及`ssh-agent`(用于管理私钥的守护进程)和`ssh-add`(用于向代理添加密钥的工具)。 根据错误信息,我们可以逐一分析并解决: ### 1. ssh-agent has no private key 这个错误意味着`ssh-agent`中没有加载任何私钥。当我们尝试使用SSH连接时,客户端会向`ssh-agent`请求私钥进行身份验证,如果没有加载任何私钥,就会报错。 **解决方法:** - **步骤1:启动ssh-agent** 确保`ssh-agent`正在运行,并且环境变量已正确设置。 ```bash eval "$(ssh-agent -s)" ``` 这通常会输出类似`Agent pid 12345`的信息。 - **步骤2:将私钥添加到ssh-agent** 使用`ssh-add`命令添加私钥文件(默认是`~/.ssh/id_rsa`,也可以是其他密钥文件)。 ```bash ssh-add ~/.ssh/id_rsa ``` 如果密钥有密码,会提示输入密码。 - **步骤3:验证是否添加成功** 使用`ssh-add -l`列出已加载的私钥,确认你的密钥是否在列表中。 ### 2. failed to encrypt passphrase 这个错误通常发生在尝试添加密钥到`ssh-agent`时,可能是因为密钥的密码(passphrase)加密失败。可能的原因包括: - 系统缺少必要的加密库或配置。 - 密钥文件损坏。 - `ssh-agent`配置问题。 **解决方法:** - **步骤1:检查密钥文件** 确保密钥文件是有效的。可以尝试使用文本编辑器打开(注意不要修改),查看是否以`-----BEGIN RSA PRIVATE KEY-----`开头(或其他密钥类型)。 - **步骤2:尝试重新生成密钥** 如果密钥文件损坏,考虑重新生成密钥对。 ```bash ssh-keygen -t rsa -b 4096 -C "your_email@example.com" ``` 然后再次尝试添加到`ssh-agent`。 - **步骤3:检查系统环境** 确保系统有正常的加密功能(如OpenSSL正常工作)。可以尝试: ```bash openssl version ``` 如果缺失,安装OpenSSL。 - **步骤4:尝试使用不同的密钥类型** 有时候特定类型的密钥可能有问题(比如RSA),可以尝试使用其他类型(如ed25519): ```bash ssh-keygen -t ed25519 -C "your_email@example.com" ``` ### 3. failed to register ssh key 这个错误可能发生在将公钥注册到远程服务器(如GitHub)或本地`ssh-agent`时。这里我们主要关注本地注册(即添加到`ssh-agent`)失败的情况。 **解决方法:** - **步骤1:检查`ssh-agent`是否运行** 同第一个错误的步骤1。 - **步骤2:检查密钥文件权限** 密钥文件(私钥)的权限必须严格,否则`ssh-add`会拒绝添加。确保: - 私钥文件权限为`600`:`chmod 600 ~/.ssh/id_rsa` - `.ssh`目录权限为`700`:`chmod 700 ~/.ssh` - **步骤3:尝试使用绝对路径添加** 有时使用相对路径可能有问题,使用绝对路径添加: ```bash ssh-add /home/username/.ssh/id_rsa ``` - **步骤4:检查ssh-agent的配置** 查看是否有环境变量覆盖,比如`SSH_AUTH_SOCK`是否指向正确的socket文件。使用: ```bash echo $SSH_AUTH_SOCK ``` 确保这个路径存在。如果没有设置或者不正确,可以重新设置: ```bash export SSH_AUTH_SOCK=/tmp/ssh-XXXXXX/agent.XXXX ``` 其中路径可以通过重新启动`ssh-agent`获得。 - **步骤5:重启ssh-agent** 如果上述步骤无效,可以尝试重启`ssh-agent`: ```bash ssh-agent -k # 杀死当前代理 eval "$(ssh-agent -s)" # 重新启动 ``` ### 综合步骤 通常,我们可以按照以下步骤全面排查: 1. **确保`ssh-agent`运行并设置环境变量** ```bash eval "$(ssh-agent -s)" ``` 2. **检查并修复密钥文件权限** ```bash chmod 700 ~/.ssh chmod 600 ~/.ssh/id_rsa # 替换为你的私钥文件 chmod 644 ~/.ssh/id_rsa.pub # 公钥权限可以宽松 ``` 3. **添加私钥到`ssh-agent`** ```bash ssh-add ~/.ssh/id_rsa ``` 4. **如果提示输入密码,确保密码正确**。如果忘记密码,需要重新生成密钥对。 5. **如果添加时出现加密错误,考虑重新生成密钥**(使用ed25519类型可能更安全且问题较少): ```bash ssh-keygen -t ed25519 -C "your_email@example.com" ``` 6. **将新公钥添加到远程服务器**(如GitHub或目标服务器): ```bash # 复制公钥到剪贴板(Linux) cat ~/.ssh/id_ed25519.pub | xclip -selection clipboard ``` 然后将其添加到远程服务器的`~/.ssh/authorized_keys`文件(对于服务器)或GitHub的SSH keys设置中。 7. **测试连接**: ```bash ssh -T git@github.com # 测试GitHub ssh user@remote_server # 测试远程服务器 ``` 8. **如果仍然有问题,启用详细模式**: ```bash ssh -vT git@github.com ``` 查看详细的错误信息。 ### 相关问题 1. SSH密钥对生成的最佳实践是什么? 2. 如何配置SSH免密登录远程服务器? 3. `ssh-agent`的工作原理是什么? 4. 如何在不同操作系统上管理SSH密钥? 5. 如何解决SSH连接超时问题? </think>针对 SSH 互信报错 `ssh-agent has no private key`、`failed to encrypt passphrase` 和 `failed to register ssh key` 的问题,以下是系统化的解决方案: --- ### 一、核心问题分析 | 错误类型 | 原因分析 | 关联性 | |------------------------------|--------------------------------------------------------------------------|------------------------| | **`ssh-agent has no private key`** | SSH 代理未加载私钥,导致身份验证失败 | 通常由 `ssh-add` 失败引起 | | **`failed to encrypt passphrase`** | 密钥密码加密失败(系统加密库异常/权限问题) | 导致无法添加密钥到代理 | | **`failed to register ssh key`** | 密钥注册失败(密钥格式错误/权限问题/代理未运行) | 前序步骤失败的直接结果 | --- ### 二、逐步解决方案 #### 步骤 1:修复基础环境 ```bash # 重启 ssh-agent 并重置环境变量 eval "$(ssh-agent -k)" 2>/dev/null # 终止旧代理 eval "$(ssh-agent -s)" # 启动新代理 export SSH_AUTH_SOCK=$(ssh-agent -s | grep -oP '(?<=SSH_AUTH_SOCK=)[^;]+') ``` - **作用**:解决代理未运行或环境变量失效问题[^1] #### 步骤 2:修复密钥权限 ```bash # 修复密钥文件权限 chmod 700 ~/.ssh # 目录权限 chmod 600 ~/.ssh/id_* # 私钥权限 (RSA/ECDSA/Ed25519) chmod 644 ~/.ssh/id_*.pub # 公钥权限 ``` - **关键点**:私钥权限必须是 `600`,否则触发加密错误 `failed to encrypt passphrase` #### 步骤 3:重新添加密钥到代理 ```bash # 明确指定密钥类型添加 (以 ed25519 为例) ssh-add -t 1h ~/.ssh/id_ed25519 # -t 设定密钥缓存时间 ``` - **若提示密码加密失败**: ```bash # 临时切换加密库 (使用 OpenSSL 作为后备) export SSH_ASKPASS_REQUIRE=openssl ssh-add ~/.ssh/id_ed25519 ``` #### 步骤 4:验证密钥状态 ```bash ssh-add -l -E sha256 # 列出已加载密钥指纹(SHA256格式) ``` 输出示例: ```plaintext 256 SHA256:AbC123...xYz user@host (ED25519) ``` --- ### 三、进阶排查方法 #### 场景 1:密钥生成问题(导致 `register` 失败) ```bash # 重新生成 Ed25519 密钥(推荐) ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519_new -C "user@host" ``` - **参数说明**: `-a 100`:增强 KDF 迭代次数 `-t ed25519`:现代算法避免兼容问题[^1] #### 场景 2:系统加密库冲突 ```bash # 检查系统加密策略 update-crypto-policies --show # RHEL/CentOS grep /etc/ssh/ssh_config -e "Ciphers" # 检查客户端加密配置 # 临时降级策略(测试用) update-crypto-policies --set LEGACY ``` --- ### 四、配置优化建议 在 `~/.ssh/config` 中添加: ```config Host * AddKeysToAgent yes # 自动加载密钥到代理 IdentityFile ~/.ssh/id_ed25519 IdentityFile ~/.ssh/id_rsa_backup PKCS11Provider /usr/lib/softhsm/libsofthsm2.so # 若使用硬件密钥 ``` --- ### 五、错误处理流程图 ```mermaid graph TD A[ssh-agent has no private key] --> B{检查 ssh-add -l} B -->|无密钥| C[执行 ssh-add] C --> D[failed to encrypt passphrase?] D -->|是| E[检查权限/chmod 600] E --> F[验证加密库/SSH_ASKPASS_REQUIRE] D -->|否| G[成功] C --> H[failed to register ssh key] H --> I[重新生成密钥/ssh-keygen -t ed25519] I --> J[添加新密钥] ``` --- ### 相关问题 1. 如何为 SSH 密钥设置更强的密码策略? 2. 使用硬件安全模块(HSM)管理 SSH 密钥有哪些注意事项? 3. 在多服务器环境中如何批量部署 SSH 公钥? 4. SSH Agent Forwarding 的安全风险有哪些?如何规避? > 请逐条执行上述步骤,90% 的此类错误可通过权限修复和代理重启解决[^1]。若问题持续,建议检查系统日志 `journalctl -u sshd`。 [^1]: 解决方案整合自 SSH 协议规范及 OpenSSH 官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值