关于SSH登录

事情起因还是昨天 公司的 Git服务器 进行了升级 导致之前的 SSH Key 都不能使用了需要重新上传 然后配置项目地址 开通项目权限即可 很简单的一个事情

可是某些人踏马来了公司1年了连生成 公钥私钥都不会 最搞笑的是设置密码的时候提示密码太短 他居然看不懂 跑过来抱怨说生成不了,心里一万只草泥马路过…


生成公钥私钥

一般文件都在用户下的 .ssh 文件夹中

1
2
3
4
5
$ ls -l
total 9
-rw-r--r-- 1 reggie 197121 1675 717 16:36 id_rsa
-rw-r--r-- 1 reggie 197121 400 717 16:36 id_rsa.pub
-rw-r--r-- 1 reggie 197121 211 1226 17:36 known_hosts

这个是我已有的

新生成的话可以执行下面的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
Generating public/private rsa key pair
Enter file in which to save the key (/用户/.ssh/id_rsa):
Created directory '/用户/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /用户/.ssh/id_rsa.
Your public key has been saved in /用户/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:gbaLAiKKUm8lv2INJYu4KxXLRF1GT8nTt24geNGI6Co your_email@example.com
The key's randomart image is:
+---[RSA 4096]----+
| . ++o.= |
| . o..+* o . |
| . . o.oo . . |
| o o.o.o.. . |
|++.=.+o.S. o |
|Eo*.o= . o |
|++. +oo . |
|+ oo .. |
|o. . .. |
+----[SHA256]-----+

一路回车就好了 为了更安全还可以设置密码 不过一般都是默认设置没有就好了。

其中 id_rsa 是你的私钥文件 id_rsa.pub 是你的公钥文件 把公钥文件上传到服务器上就可以 比如 Github 的 SSH Key 管理中

下面在记录几个常用的命令

修改密钥密码 ssh-keygen -p
切换Git仓库地址 git remote set-url origin git-repository-address

目录权限问题

一般服务器端的SSH密钥都在 /etc/ssh

1
2
3
4
5
6
7
8
9
10
[root@localhost ssh]# ls -l /etc/ssh/
$ ls -1 /etc/ssh/ssh_host*
/etc/ssh/ssh_host_dsa_key
/etc/ssh/ssh_host_dsa_key.pub
/etc/ssh/ssh_host_ecdsa_key
/etc/ssh/ssh_host_ecdsa_key.pub
/etc/ssh/ssh_host_ed25519_key
/etc/ssh/ssh_host_ed25519_key.pub
/etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_rsa_key.pub

根据一开始的提示 需要使用 ECDSA 所以选择使用 ssh_host_ecdsa_key.pub 文件

另外讲下目录权限问题

一般 .ssh目录权限为 755 或者 700
rsa.id.pubauthiruzed_keys 权限为 644
rsa.id 权限必须是 600

SSH 是什么

SSH 是一种协议标准,其目的是实现安全远程登录以及其它安全网络服务。 其实现种类有很多 最出名的就是开源的 OpenSSH

SSH 实现原理

SSH是为了保证更安全的登录等 当然就是对数据进行加密

对称加密

关于这个更多请自己去科普

简单点讲就是 加密解密 都是使用的 同一组密钥

1.客户端请求登录 发送密码 假设原始密码为 123abc 然后使用 密钥β 进行加密 得到加密内容 xxxxxx....
2.然后把加密内容 xxxxxx.... 发送给服务器
3.服务器接受到内容 然后使用 密钥β 进行解密 得到密码 然后登录
4.返回登录结果

使用这种对称加密的方式加密的强度是很高,但是如何保存密钥不泄露呢,比如你有很多的客户端需要使用 他们都需要有一份密钥,如果其中一个泄露了 这个系统就不在试安全了 因为你都是使用的同一个嘛

非对称加密

为了解决上面的问题 就有了 非对称加密

简单来讲就是会生成生成 2个密钥 一个是 公钥 一个是 私钥 一般私钥放在服务端 自己保重安全不泄露

他们有个特性就是:使用公钥加密的内容 只能使用私钥来解密。如果你想通过公钥来推出私钥 其几率低的发指(数学家说的…我不知道有多低 大家都说低那就低喽)大概 约等于 不可能吧!!!

1.客户端发起登录请求 然后服务器返回公钥给客户端
2.客户端拿到公钥后 对密码 123abc 进行加密 得到内容 xxxxx...
3.然后把加密内容发送给服务器
4.服务器收到加密内容后使用私钥进行解密
5.然后验证用户身份 执行登录操作
6.返回登录结果

中间人攻击

理论上上面这样是安全的,但是这里会有个问题,就是 你不能保证在上面的流程第一步当中获取到的公钥就是你想要连接的服务器的公钥

中间人攻击:

如果有攻击者在第一步获取服务器公钥的时候就拦截掉 然后把自己的公钥发送给了 客户端。然后用户用攻击者的公钥进行加密并发送到了攻击者的服务器,然后> 攻击者就可以拿自己的私钥解密获取你的信息,然后他在去请求真正的服务器从而完成了登录 这就是中间人攻击

更多详细内容自己搜索

SSH 公钥认证

SSH 怎么避免中间人攻击呢。 好像并没有什么好办法,只是在第一次连接的时候他会给出提示 并给出服务器的公钥指纹 需要我们自己去做对比 服务器是否真实!!! 这个可以在 known_hosts 讲解中看到。

公钥认证的登录流程如下

首先使用 ssh-keygen 程序生成公钥 id_dsa.pub 和私钥 id_dsa,一般是在客户端上生成,然后把 id_dsa.pub 通过某种方式发送给服务端。 服务端放在将要远程登录过来的那个 账号的目录的 .ssh 目录下面。

1.客户端需要生成自己的公钥和私钥文件,并把公钥文件上传到服务器端
2.客户端发起登录请求 发送一个 Keyid 给服务器 这个keyid 会唯一对应一个客户端的公钥 然后服务器就可以拿这个标识去找客户端的公钥
3.服务器生成一个随机串 然后用客户端的公钥进行加密 最后将加密后的内容发送给客户端
4.客户端收到密文后用自己的私钥进行解密得到服务器发送的随机串, 然后对随机串做MD5哈希 生成摘要
5.客户端在把最终的摘要发送给服务端,同时服务端也会用同样的方法对进行生成摘要
6.最后服务端比较2个摘要内容是否一致 完成认证过程


-------------The End-------------