也不知原创的定义是什么,照百科上的得是全新的才是原创,那就没啥好写了。
前半篇RSA的简介是参考阮一峰先生的博客。后半篇其实也能通过各种渠道搜到也不算上原创。故标记为转载。
(吐槽:这个转载原创标签太难搞了吧,还是CC好)
- 阮一峰先生的文档信息
版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
文章目录
rsa简介
rsa
什么是rsa
RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。它的基本原理是利用大数难以质因数分解,它有一对数字:
- 密钥(yao4):绝对不能透露给别人。
- 公钥:是要给别人的。
具体原理请见阮一峰的blog
rsa的用途
身份验证
所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。
数字签名
数字签名用于发行软件时防止别人篡改,具体流程是这样的:
-
发行者对文件进行hash校验,并把这个校验值和进行私钥加密得到数字签名,大家通过公布在网站上的公钥解开这段密文(数字签名),也就是文件的hash值。
-
下载者对文件进行hash校验,和1.中得到的hash值进行比对。
上面两个步骤如何防止第三方修改,发行者加密的文件第三方当然可以通过公钥解密之后修改,但是你也无法生成(到时候用户要用公布在网站上的公钥解密的)数字签名(必须知道密钥)。
ssh用rsa方式登录远程主机
为什么要用rsa登录
- 方便,每次登录不用输密码。
- 安全,禁用密码登录后,不怕别人猜到密码。
文件信息
本文会涉及两个文件夹,一个是在客户端(client),一个是服务器端(server):
- rsa 密钥位置(client):
~/.ssh/
- ssh 配置文件(server):
/etc/ssh/sshd_config
client 和 server 是相对的概念,在一次连接中,主动寻求连接的是 client ,被连的是 server。
操作
client
- 生成密钥对: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
: 公钥
# 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
/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
- 重启远程主机的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_rsa | rsa密钥,对应的公钥放在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的。