关于SSH登录
事情起因还是昨天 公司的 Git服务器
进行了升级 导致之前的 SSH Key
都不能使用了需要重新上传 然后配置项目地址 开通项目权限即可 很简单的一个事情。
生成公钥私钥#
一般文件都在用户下的 .ssh
文件夹中
$ ls -l
total 9
-rw-r--r-- 1 reggie 197121 1675 7月 17 16:36 id_rsa
-rw-r--r-- 1 reggie 197121 400 7月 17 16:36 id_rsa.pub
-rw-r--r-- 1 reggie 197121 211 12月 26 17:36 known_hosts
这个是我已有的
新生成的话可以执行下面的命令
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
下
[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 或者 700rsa.id.pub
和 authiruzed_keys
权限为 644rsa.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 个摘要内容是否一致 完成认证过程
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: