ssh免密登录远程主机(by rsa)

本文深入解析了RSA加密算法及其在SSH公钥登录中的应用,包括密钥生成、配置过程及安全性提升方法。

也不知原创的定义是什么,照百科上的得是全新的才是原创,那就没啥好写了。
前半篇RSA的简介是参考阮一峰先生的博客。后半篇其实也能通过各种渠道搜到也不算上原创。故标记为转载。
(吐槽:这个转载原创标签太难搞了吧,还是CC好)

  • 阮一峰先生的文档信息
    版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证

转载部分: 身份验证数字签名


rsa简介

rsa

什么是rsa

RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。它的基本原理是利用大数难以质因数分解,它有一对数字:

  1. 密钥(yao4):绝对不能透露给别人。
  2. 公钥:是要给别人的。

具体原理请见阮一峰的blog

rsa的用途

身份验证

所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

数字签名

数字签名用于发行软件时防止别人篡改,具体流程是这样的:

  1. 发行者对文件进行hash校验,并把这个校验值和进行私钥加密得到数字签名,大家通过公布在网站上的公钥解开这段密文(数字签名),也就是文件的hash值。

  2. 下载者对文件进行hash校验,和1.中得到的hash值进行比对。

    上面两个步骤如何防止第三方修改,发行者加密的文件第三方当然可以通过公钥解密之后修改,但是你也无法生成(到时候用户要用公布在网站上的公钥解密的)数字签名(必须知道密钥)。

ssh用rsa方式登录远程主机

为什么要用rsa登录

  1. 方便,每次登录不用输密码。
  2. 安全,禁用密码登录后,不怕别人猜到密码。

文件信息

本文会涉及两个文件夹,一个是在客户端(client),一个是服务器端(server):

  • rsa 密钥位置(client):~/.ssh/
  • ssh 配置文件(server):/etc/ssh/sshd_config

client 和 server 是相对的概念,在一次连接中,主动寻求连接的是 client ,被连的是 server。

操作

client

  1. 生成密钥对:rsa 和 rsa.pub
ssh-keygen -t rsa

得到

Generating public/private rsa key pair.
# 输入rsa对(`id_rsa`和`id_rsa.pub`)名称(带路径)
Enter file in which to save the key (/home/user/.ssh/id_rsa):
# 输入密码,使用rsa密钥时(这里就是登录远程主机时)用的
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

将会生成

  • rsa: 密钥
  • rsa_rsa.pub: 公钥
  1. rsa.pub附加到server ~/.ssh/authorized_keys的文件内
# Following 2 codes are excuted on client
ssh-copy-id [-i ~/.ssh/rsa.pub] user@host
# or
ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

一个粗暴的办法,复制client内的id_rsa.pub的内容,登录server,附加到~/.ssh/authorized_keys

server

  1. /etc/ssh/sshd_config 的配置
PubkeyAuthentication yes
AuthorizedKeysFile	.ssh/authorized_keys #.ssh/authorized_keys2
PasswordAuthentication yes

可以找到相应的项并取消注释。

参数解释
PubkeyAuthentication yes允许公钥登录
AuthorizedKeysFile .ssh/authorized_keys #.ssh/authorized_keys2由 client 生成的公钥,可以添加多个
PasswordAuthentication yes是否允许用密码登录
(禁用后,如果密钥丢失就不能登录远程主机了)

可能你的系统用的是第一版ssh协议需要添加 RSAAuthentication yes 这一项来允许rsa方式登录,或者在/etc/ssh/sshd_config添加

Protocol 2

更多详细帮助见man sshd_config

  1. 重启远程主机的sshd服务
# systemctl restart sshd

附:不用输入name@ip的方法——~/.ssh/config的配置

Host ubuntu
	HostName X.X.X.X
	Port 22
	User name
	IdentityFile ~/.ssh/id_rsa
参数意思
HostName 192.168.1.2远程主机 ip, ssh name@ip 中的ip
Port 22远程主机 端口号(port), 默认是22,termux: 8022
User name登录名, ssh name@ip 中的name
IdentityFile ~/.ssh/id_rsarsa密钥,对应的公钥放在server上了
  • 更多参数详见帮助man ssh_config

这样就可以直接通过

ssh ubuntu

来登录远程主机

附:ssh-keygen 公钥如果丢失,由私钥生成公钥

ssh-keygen -y -f id_rsa > id_rsa.pub

生成的id_rsa.pub 相比于自动生成的少了最后一项,但是没关系因为rsa.pub格式
一般分为三部分:密钥类型、base64编码后的密钥、注释(可选)。中间用空格分开。

附:ssh 时的fingerprint作用

$ ssh localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:o2cGXCQtdhvWUXG8liYGWJrhVuP4YF9/E839KY1HqH4.
Are you sure you want to continue connecting (yes/no)?

这个是为了防止我连接的server不是我想连的server,有可能是假的。这个fingerprint是用来确认server的身份的。这个就是我们之前提到的rsa公钥,只不过这次的fingerprint是server的。

### 配置集群 SSH 免密登录 #### 1. 准备工作 在配置集群中的 SSH 免密登录之前,需要确保每台机器都已经安装了 OpenSSH 客户端和服务端软件。可以通过以下命令验证是否已安装: ```bash ssh -V ``` 如果未安装,则可以在基于 Debian 的系统中通过 `apt-get install openssh-client` 和 `apt-get install openssh-server` 进行安装,在基于 RedHat 的系统中则使用 `yum install openssh-clients` 和 `yum install openssh-server`。 --- #### 2. 创建公私钥对 在每台服务器上生成一对 RSA 密钥(公钥和私钥)。假设当前用户的家目录为 `/home/haha1`,执行如下命令来创建 `.ssh` 文件夹以及生成密钥对: ```bash cd /home/haha1 && mkdir ~/.ssh && chmod 700 ~/.ssh ssh-keygen -t rsa ``` 此过程会提示输入文件名存储位置,默认为 `~/.ssh/id_rsa`;接着设置密码短语(可留空以跳过),最后生成两个文件:`id_rsa`(私钥) 和 `id_rsa.pub`(公钥)[^1]。 --- #### 3. 设置本地免密登录 为了测试单机环境下的无密码认证机制正常运作,需将自身的公钥复制至 authorized_keys 中: ```bash cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys ``` 上述指令把 id_rsa.pub 内容追加到 authorized_keys 文件里,并调整权限防止其他用户读取敏感数据[^2]。 --- #### 4. 将各节点的公钥分发给所有节点 对于分布式计算框架如 Hadoop 来说,通常会有多个物理或者虚拟节点组成一个逻辑上的整体运算单元。为了让这些成员之间能够互相无障碍通信而无需每次都提供身份凭证,必须让每一个参与方知晓彼此的身份标识即交换各自的 public keys. 具体做法是从 master 节点开始收集 slave(s) 上面产生的 pubic key 并集中管理再广播回去: ```bash for node in $(cat nodes_list); do scp ~/.ssh/id_rsa.pub ${node}:~/; done ``` 这里假定有一个名为nodes_list 的文本档列出了所有目标主机地址列表。之后进入任一子节点合并收到的新key 到统一集合当中去: ```bash cat ~/id_rsa.pub >> ~/.ssh/authorized_keys && rm ~/id_rsa.pub ``` 重复以上动作直至覆盖整个网络范围内的全部设备为止[^3]. --- #### 5. 解决可能遇到的问题 即使完成了前面提到的各项准备工作,实际运行过程中仍可能出现某些异常状况比如连接超时等问题。“ssh_exchange_identification: read: Connection reset by peer”的错误可能是由于频繁失败尝试致使远程站点暂时封锁IP 地址所致。此时应该检查 `/etc/sshd.deny.hostguard` 或者相似命名模式的日志文档寻找对应条目加以移除后再重试链接请求[^4]: ```bash nano /etc/sshd.deny.hostguard # 找到对应的 IP 删除后保存退出 service sshd restart ``` --- ### 总结 完成上述步骤后,理论上就可以实现在指定范围内任何两点间的无缝切换操作而不必担心繁琐的手动验证流程干扰正常使用体验了。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值