FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

添加了ssh相关的博文 · Excuse1/AndroidNote@a90a9d0 · GitHub

Commit a90a9d0

Browse files
committed
添加了ssh相关的博文
1 parent c76fdd9 commit a90a9d0

2 files changed

Lines changed: 155 additions & 0 deletions

File tree

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
# SSH原理与应用
2+
3+
ssh在程序员的生活中还是非常常见的,ssh具有很多种功能,也可以用在很多种场合。
4+
5+
## 什么是SSH
6+
7+
SSH是一种网络协议,用于计算机之间的加密登录
8+
9+
当我们在一台电脑上面,运用ssh登录了另一台计算机,我们便可以认为,这种登录是安全的了,因为即使中途被截获,我们的密码也不会泄漏。
10+
11+
最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。
12+
13+
需要指出的是,SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文针对的实现是OpenSSH,它是自由软件,应用非常广泛。
14+
15+
此外,本文只讨论SSH在Linux Shell中的用法。如果要在Windows系统中使用SSH,会用到另一种软件PuTTY,这需要另文介绍。
16+
17+
## 用法
18+
19+
1. 登录远程服务器
20+
``ssh root@host``
21+
22+
2. 如果当前用户与远程用户同名
23+
``ssh host``
24+
25+
3. ssh默认的端口是22,如果我们要修改登录的默认端口
26+
``ssh -p xx root@host``
27+
28+
## 中间人攻击
29+
30+
ssh采用的是非对称加密,也就是要采用公钥和私钥的方式进行加密。
31+
32+
整个通信的过程是这样的:
33+
1. 远程主机收到用户的登录请求,将公钥发送给用户
34+
2. 用户使用这个公钥,将登录的密码进行加密,发送给后台
35+
3. 远程主机,用自己的私钥进行解密,判断用户名密码是否正确
36+
37+
整个过程看起来是很完美的,但是容易产生一种中间人攻击的现象:
38+
39+
我们发送出去的登录的信息,被中途截获了,一个中间人,将他的公钥发送过来,这样用户加密之后,他便可以用自己的私钥解密了,这样他就拥有了我们的密码,并且可以一直在中间监听我们的通话。
40+
41+
当然,这是基于口令的通信方式,我们也可以采用基于密钥的加密方式:
42+
43+
第二种级别(基于密匙的安全验证)需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。 如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在你在该服务器的家目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。
44+
45+
这样我们便可以防止中间人攻击的现象了。
46+
47+
48+
## 口令登录
49+
50+
```
51+
$ ssh user@host
52+
The authenticity of host 'host (12.18.429.21)' can't be established.
53+
RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
54+
Are you sure you want to continue connecting (yes/no)?
55+
```
56+
这段话的意思是,无法确认host主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?
57+
所谓"公钥指纹",是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹。上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d,再进行比较,就容易多了。
58+
很自然的一个问题就是,用户怎么知道远程主机的公钥指纹应该是多少?回答是没有好办法,远程主机必须在自己的网站上贴出公钥指纹,以便用户自行核对。
59+
假定经过风险衡量以后,用户决定接受这个远程主机的公钥。
60+
61+
```
62+
Are you sure you want to continue connecting (yes/no)? yes
63+
```
64+
系统会出现一句提示,表示host主机已经得到认可。
65+
```
66+
Warning: Permanently added 'host,12.18.429.21' (RSA) to the list of known hosts.
67+
```
68+
然后,会要求输入密码。
69+
```
70+
Password: (enter password)
71+
```
72+
如果密码正确,就可以登录了。
73+
当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。
74+
每个SSH用户都有自己的known_hosts文件,此外系统也有一个这样的文件,通常是/etc/ssh/ssh_known_hosts,保存一些对所有用户都可信赖的远程主机的公钥。
75+
76+
77+
78+
## 公钥登录
79+
80+
使用密码登录,每次都必须输入密码,非常麻烦。好在SSH还提供了公钥登录,可以省去输入密码的步骤。
81+
82+
所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。
83+
这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用ssh-keygen生成一个:
84+
85+
```
86+
$ ssh-keygen
87+
```
88+
89+
运行上面的命令以后,系统会出现一系列提示,可以一路回车。其中有一个问题是,要不要对私钥设置口令(passphrase),如果担心私钥的安全,这里可以设置一个。
90+
运行结束以后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。
91+
这时再输入下面的命令,将公钥传送到远程主机host上面:
92+
93+
```
94+
$ ssh-copy-id user@host
95+
```
96+
97+
好了,从此你再登录,就不需要输入密码了。
98+
如果还是不行,就打开远程主机的/etc/ssh/sshd_config这个文件,检查下面几行前面"#"注释是否取掉。
99+
100+
```
101+
RSAAuthentication yes
102+
PubkeyAuthentication yes
103+
AuthorizedKeysFile .ssh/authorized_keys
104+
```
105+
106+
然后,重启远程主机的ssh服务。
107+
108+
```
109+
// ubuntu系统
110+
  service ssh restart
111+
  // debian系统
112+
  /etc/init.d/ssh restart
113+
```
114+
115+
## authorized_keys文件
116+
117+
远程主机将用户的公钥,保存在登录后的用户主目录的$HOME/.ssh/authorized_keys文件中。公钥就是一段字符串,只要把它追加在authorized_keys文件的末尾就行了。
118+
119+
这里不使用上面的ssh-copy-id命令,改用下面的命令,解释公钥的保存过程:
120+
121+
```
122+
$ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
123+
```
124+
125+
这条命令由多个语句组成,依次分解开来看:(1)"$ ssh user@host",表示登录远程主机;(2)单引号中的mkdir .ssh && cat >> .ssh/authorized_keys,表示登录后在远程shell上执行的命令:(3)"$ mkdir -p .ssh"的作用是,如果用户主目录中的.ssh目录不存在,就创建一个;(4)'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub的作用是,将本地的公钥文件~/.ssh/id_rsa.pub,重定向追加到远程文件authorized_keys的末尾。
126+
写入authorized_keys文件后,公钥登录的设置就完成了。
127+
128+
## 配置ssh config
129+
130+
```
131+
vi ~/.ssh/config
132+
133+
134+
// 文件内容如下
135+
136+
Host js //别名, 可以直接执行 ssh js
137+
138+
HostName 172.16.6.84 //Host别名指向的服务器 IP
139+
140+
User zhangsan //登录所用的用户名
141+
142+
PreferredAuthentications publickey //鉴权方式
143+
144+
IdentityFile ~/.ssh/zhangsan.pem //认证所需的密钥
145+
```
146+
这样我们便可以通过``ssh js``来代替曾经的``ssh xxx@111.11.11.11``
147+
并且采用公钥+私钥的加密方式,不用输入密码,非常的方便。
148+
149+
150+
## 参考文献
151+
152+
- [SSH原理与运用](http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html)
153+
154+
- [网络安全协议比较](http://blog.csdn.net/shizhixin/article/details/42459265)

‎README.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ Android-Note里面记录了有关Android的常用基础知识、面试中经常
3939
- [Android项目总结](/AndroidNote/Android进阶/Android项目总结.md)
4040
- [自定义RadioGroup](/AndroidNote/Android进阶/自定义RadioGroup.md)
4141
- [Android导入项目一直在Building的解决方案](/AndroidNote/Android进阶/AndroidStudio导入工程一直在Building的解决方案.md)
42+
- [SSH原理与应用](/AndroidNote/Android进阶/SSH原理与应用.md)
4243

4344

4445
### 自定义View

0 commit comments

Comments
 (0)

Back | FazBrowse Home | New Git URL