Linux-SSH免密码登录

5,255 阅读5分钟

大家好,我是言淦,我今天带来的文章是《Linux-SSH免密码登录》,希望能给你们带来帮助!

SSH简介

SSH 为 Secure Shell 的缩写, 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。既有商业实现,也有开源实现。本文针对的实现是OpenSSH,它是自由软件,应用非常广泛。

生成密钥

SSH协议的安全验证采用公私钥配对的方式,通过ssh-keygen生成密钥。

# 绝大部分系统都预装了ssh-keygen, 如果没有可通过此命令安装
$ apt install openssh-client

# 生成类型为rsa的密钥
$ ssh-keygen -t rsa  

# 一路回车
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):  回车
Created directory '/root/.ssh'.  
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:aJyKwIdqxKTkJNJ/T/HZsGGw5mLoI6iodJ4RIiIu53U root@685331521bf6
The key's randomart image is:

# 如果你是第一次生成密钥,默认存储路径是 "~/.ssh", 其中"id_rsa"就是你的私钥,"id_rsa.pub"就是你的公钥

SSH密钥最大的好处免密码登录,一般有两个场景会用到,第一就是git push的时候不用输入密码,第二就是ssh 免密码登录到其他机器,在分布式系统中比较常见,用于分发任务到其他机器。

那SSH是如何做到免密码登录的呢?下面就会揭晓它的原理。

SSH免密码登录原理步骤

我们假设有两台机器A, B,我们需要实现机器A SSH免密码登录到B, 这时我们需要现在机器A上生成公钥私钥, 也就是我们上面提到的"ssh-keygen -t rsa"。

ssh-keygen -t rsa

第二,我们需要在机器A上生成一份authorized_keys, 用于存储每台机器A的公钥。

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

第三,我们还需要改变authorized_keys的权限,使之能够拷贝到其他机器上

chmod 644 ~/.ssh/authorized_keys

第四,我们需要确保能用账号密码的方式登入到B机器

ssh root@172.17.0.4

第五,我们还需要通过ssh-copy-id将机器A的公钥复制到机器B的 "~/.ssh/authorized_keys"文件中

ssh-copy-id root@172.17.0.4 # 需要输入密码(默认公钥)
ssh-copy-id -i ~/.ssh/id_rsa_yangan root@172.17.0.4 # 复制自定义公钥

第六,将机器A使用的私钥添加到由ssh-agent 维护的列表中

ssh-add ~/.ssh/id_rsa

第七,执行 "ssh root@172.17.0.4" 可以发现不用输入密码,实现免密码登录。

这里内部的原理是这样的,由于前面机器B已经添加了机器A的公钥,所以当机器A发起 "ssh root@172.17.0.4" 时, 其实是先向B发送一个连接请求, 机器B得到机器A的信息后,在authorized_key中查找,如果有相应的用户名和IP,则随机生成一个字符串,并用机器A的公钥加密,发回给机器A; 机器A得到机器B发来的消息后,使用私钥进行解密,然后将解密后的字符串发送给机器B。机器B将自己生成的字符串和机器A发来的字符创进行对比,如果一致,则允许免登录。

注: 复制公钥的时候建议使用ssh-copy-id,不要手动加, 本人曾犯过一个错误,ssh到B机器的root用户,却把公钥复制到机器B其他用户上,导致一直失败。

gitlab ssh 免密码下载

实现git clone的免密码登录其实也挺简单, 我们的电脑相当于机器A, gitlab服务器相当于机器B, 我们只要在本地生成公私钥,再把公钥添加到gitlab即可。

示意图如下:

当其实这里往往会面临另外一个问题,如何生成多个SSH密钥,以及为什么生成了密钥仍然要输入密码?

# 1.生成多个密钥
$ ssh-keygen -t rsa -C "xxx@qq.com" -f ~/.ssh/id_rsa_yangan

# 继续一路默认,就可以看到~/.ssh下多了 id_rsa_yangan 和 id_rsa_yangan.pub, 原来的密钥并不会被覆盖,
# 所以当你想要生成多个密钥时,只要更换 -C 和 -f 对应的参数即可

为什么生成了密钥,并把公钥粘贴到gitlab, git clone的时候仍然需要密码?

~/.ssh# git clone git@xxxx.git
Cloning into 'xxxx'...
git@xxxx's password:

这是因为你没有在ssh配置文件(~/.ssh/config 或者 /etc/ssh/ssh_config)配置所使用的公私钥名称

vim /etc/ssh/ssh_config

Host *
#   ForwardAgent no
... 
#  取消注释
    IdentityFile ~/.ssh/id_rsa
    IdentityFile ~/.ssh/id_rsa_yangan

# 测试 ssh -T git@gitxxx.com


docker与docker之间免密码登录

dokcer与docker之间免密码登录, 与机器A免密码登录到机器B原理差不多,只不过步骤有些许差别。

假设dockerA免密码登录到dockerB, 这时你会发现直接ssh dockerB的IP, 并不能连接成功, 因为dockerB作为服务端,并没有安装 openssh-server,ssh服务都没有,怎么会连接成功呢?

sudo apt update && sudo apt openssh-server

安装完毕后,开启ssh服务

sudo /etc/init.d/ssh start

但是郁闷的来了,开启后依然连接不成功,这因为你还没有配置/etc/ssh/sshd_config

sudo vim /etc/ssh/sshd_config

加入以下内容: PermitRootLogin yes # 允许root用户使用密码和秘钥登录 PubkeyAuthentication yes RSAAuthentication yes

接着,再让dockerA重复之前提到的步骤,就可以登录了。