ssh 免密登录

Fri, 2021-02-05
ssh 免密登录

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 commands 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

# 由 client 生成的公钥,可以添加多个,多行,自己注释
AuthorizedKeysFile  .ssh/authorized_keys

# 是否允许用密码登录
# 禁用后,如果密钥丢失就不能登录远程主机了
PasswordAuthentication yes

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

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

Protocol 2

更多详细帮助见man sshd_config

  1. 重启远程主机的ssh服务
#ubuntu系统
service ssh restart

#debian系统
/etc/init.d/ssh restart

连接

ssh user@host -i .ssh/rsa

附:不用输入name@ip的方法

~/.ssh/config 进行配置配置

Host ubuntu
    # 远程主机 ip, `ssh name@ip` 中的`ip`
    HostName X.X.X.X

    # 远程主机 端口号(port), 默认是22,termux: 8022
    Port 22

    # 登录名, `ssh name@ip` 中的`name`
    User name

    # rsa密钥,对应的公钥放在server上(若无此项,则用密码登录)
    IdentityFile ~/.ssh/id_rsa
  • 更多参数详见帮助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的。

附:不要验证fingerprint

局域网内ip会变,验证不通过很不方便,可以这样配置~/.ssh/config 例如:

Host ubuntu
    ...
    StrictHostKeyChecking no
avatar
除非注明,本博客所有文章皆为原创。
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。