SSH(Secure Shell)是一种网络协议,即非常安全的shell,主要用于计算机间加密传输。SSH的主要目的是用来取代传统的 telnet 和 R 系列命令(rlogin、rsh、rexec 等)远程登录和远程执行命令的工具,实现对远程登录和远程执行命令加密,防止网络监听导致密码泄露的问发生。
1. 查看 Mac 上的 SSH key
最近在本地Git服务器上创建工程后,网页上提示:需要在其上添加client主机的SSH key,才能正常推拉代码。我用的是Mac,那怎样才能查看本机的SSH key呢?
打开终端,在终端中分别输入如下命令:
$ cd .ssh/
$ ls -al
红框中的文件,就存储着 SSH key:
读取文件内容,显示在控制台上,其中,以ssh-rsa... 开头完整字的符串就是的SSH key。
$ cat id_rsa.pub
2. 与SSH 相关的概念
2.1 加密
加密是将一段数据处理之后,输出为一段外人无法或者很难破译的数据,只有指定的人可以解密。 一般来说,加密过程会有一个key,这个key作为加密的参数, 解密时也会用一个相关联的key作为输入。粗略来说是下面的流程:
加密方:encrypted_data = encrypt(raw_data, key)
解密方:raw_data = decrypt(encrypted_data, key1)
主流加密算法一般分为两类:
- 对称加密(私钥加密)
对称加密就是加密方和解密方用的都是同一个key,这个key对于加密方和解密方来说是保密的,是不能让第三方知道的。第三方不知道私钥时,是很难将加密的数据解密的。一般来说是加密方先产生私钥,然后通过一个安全的途径来告知解密方这个私钥。
- 非对称加密(公钥加密)
非对称加密需要解密的一方首先生成一对密钥,一个私钥(private key)一个公钥(public key),私钥留在本地不能泄露出去,而公钥则可以任意对外发布。用公钥进行加密获得的数据,只能用私钥才能解密。加密方首先从解密方获取公钥,然后利用这个公钥进行加密,把加密后的数据发送给解密方,解密方利用私钥进行解密。如果加密的数据在传输过程中被第三方截获,因为其没有私钥,也是没有办法进行解密的。
注意:
公钥加密的问题还包括获取了公钥之后,加密方如何保证公钥来自于确定的一方,而不是某个冒充的机器,这也就涉及到了公钥加密里面比较重要的一步 —— 身份验证。
一般,对称加密都会比非对称加密效率高,所以大数据量的加密一般都会使用对称加密,而非对称加密会作为身份验证和交换私钥的一个手段。
2.2 数据的一致性(完整性)
数据的一致性是指如何保证一段数据在传输的过程中没有被遗漏、破坏或者修改过。目前普遍的做法是对数据计算hash值(摘要算法),得到的hash值和数据一起传输,然后在收到数据的时候也对数据进行hash,将得到的hash值和传输过来的hash值进行比对,如果一样,则说明收到的数据是完整的,否则,是被修改过的。
目前流行的hash算法有MD5、SHA-1算法。
2.3 身份验证
身份验证是指判断一个人或者机器是不是由第三方冒充的(类似于https抓包中的代理)。在SSH里面,这个过程主要是通过公钥来完成的,服务器会维护一个公钥列表,保存的是它信任的机器上面的公钥,在进行SSH连接时,客户端送过来一个公钥,然后服务器就会在列表中进行查找,如果这个公钥在列表中存在,就说明这个客户端是允许进行连接的。
此处有个问题,那公钥会不会被截获???
3. SSH 的工作原理
SSH的机制大体是,本地客户端发送一个连接请求到远程的服务端,服务端检查申请的包和IP地址再发送密钥给SSH客户端,本地客户端再将密钥发回给服务端,到此为止,连接建立。服务端启动SSH服务器后,sshd进程运行并在默认的22端口进行监听。
SSH机制中安全验证方式包括,基于口令的安全验证(账号密码)和基于公钥钥的安全验证:
-
密码认证缺点
- 密码容易被破解;
- 用户无法空密码登录;
- 多个人登录同一账户时,需所有用户都知道密码,并且容易泄露,修改密码极不便。
-
公钥认证
- 允许空密码登录;
- 公钥,任何人都能看到,用户加密;
- 私钥,只有拥有者看到,用于解密;
- 多人登录同一账户时,可通过各自的公钥登录到系统的;
- 通过公钥加密的的密文使用私钥轻松解密,但根据公钥来猜测私钥十分困难。
3.1 基于公钥的认证过程
本地生成一对密钥,并把公钥放到需要访问的服务器上。如果需要连接到SSH服务器上,客户端软件就会向服务器发送请求,请求用本地的密钥进行安全验证,服务器收到请求后,先在该服务器上的主目录下寻找客户端的公钥,然后把它和客户端发来的公钥进行比较。如果一致,服务器就用这个公钥加密“质询”(challenge)并把它发送给客户端软件,客户端本地接收到“质询”之后,就可用本地的私钥解密再把它发给服务器,即建立连接。
SSH 的公钥认证利用了非对称加密的特性。服务器和客户端都各自拥有自己的公钥和密钥,如下:
Ac 客户端公钥
Bc 客户端私钥
As 服务器公钥
Bs 服务器私钥
在认证之前,客户端需要通过某种方法将公钥 Ac 登录到服务器上。认证过程分为两个步骤:
1. 会话密钥(session key)生成
1)客户端请求连接服务器,服务器将 As 发送给客户端;
2)服务器生成会话ID(session id),设为 p,发送给客户端;
3)客户端生成会话密钥(session key),设为 q,并计算 r = p xor q;
4)客户端将 r 用 As 进行加密,结果发送给服务器;
5)服务器用 Bs 进行解密,获得 r;
6)服务器进行 r xor p 的运算,获得 q;
7)至此服务器和客户端都知道了会话密钥q,以后的传输都将被 q 加密。
2. 认证
1)服务器生成随机数 x,并用 Ac 加密后生成结果 S(x),发送给客户端;
2)客户端使用 Bc 解密 S(x) 得到 x;
3)客户端计算 q + x 的 md5 值 n(q+x),q为上一步得到的会话密钥;
4)服务器计算 q + x 的 md5 值 m(q+x);
5)客户端将 n(q+x) 发送给服务器;
6)服务器比较 m(q+x) 和 n(q+x),两者相同则认证成功。
3.2 基于公钥的加密过程
A和B,A想把一段明文通过双密钥加密后发送给B,B有一对公钥和私钥,加密解密过程:
- B将公钥发送给A
- A用B的公钥加密自己要发送的明文消息,然后传送给B
- B用自己私钥解密A的消息
基于公开密钥的认证过程:
身份认证和加密不同,只要身份认证,鉴别用户真伪。
只要鉴别用户的私钥是正确的,就可以鉴别身份真伪。
A和B两个用户,A想让B知道自己是真实的A,不是假冒的,因此身份认证过程:
- A用自己的私钥对文件加密,从而对文件签名,并将签名文件发送给B
- B用A的公钥解密文件,从而验证签名,完成身份认证过程
再是文件加密解密过程:同上(需完成两次验证)
4. SSH 建连过程抓包
主要包括以下步骤:
- TCP 三次握手
- SSH 协议版本协商
- 客户端与服务端的公钥交换
- 加密算法协商
- 客户端使用对称加密的密钥认证
- 客户端与服务端安全通信
我使用 wireshark 抓包并查看了一下其 SSH 的建连过程,如下:
ssh作为工具是分为服务端和客户端的,在服务端它是 sshd,一般占用 22 端口。我们平常使用的是其客户端,一般用法为 ssh user@host,然后根据 ssh 的提示,我们输入密码后登陆到服务器。
参考文章:
http://www.voidcn.com/article/p-ppggwxwc-or.html
https://www.it610.com/article/3352318.htm
SSH公钥、私钥的基本概念
SSH简介及公钥、私钥的基本概念
SSH 的公钥与私钥
数字证书、公钥、私钥概念
公钥、私钥、证书的基本概念和使用
转载 公钥、私钥、证书的基本概念和使用
SSH 公钥私钥认证
公钥,私钥和数字证书基本概念
公钥私钥
公钥/私钥
网友评论