Fork me on GitHub

SSH 协议实践

SSH概述

类似于HTTP,SSH(Secure Shell)是一种加密的网络传输协议,常用于加密远程登录。

1995年,芬兰赫尔辛基理工大学的塔图·于勒宁因为发现自己学校存在嗅探密码的网络攻击,设计了一套保护信息传输的程序,即Secure Shell(简称SSH),其目标是取代先前的rloginTelnetFTPrsh等安全性不足的协议。如今,最为广泛使用的OpenSSH便是SSH协议的一种免费开源实现。

基本原理

SSH使用非对称加密算法实现身份验证,即采用公钥-私钥对来进行加密网络连接。私钥由用户(本地主机)自行保管,公钥由远程主机(如:服务器)保管。

应用实践

下面使用OpenSSH进行具体实践。

SSH协议语法格式

SSH主要用于远程登录,如下所示为SSH协议的语法格式。

1
ssh [<username>@]<server>[:<port>]

关于SSH公钥认证

为实现公钥认证,作为认证的客户端一方需要拥有两个文件,即公钥-私钥对。一般公钥-私钥对文件创建在用户的主目录下的.ssh目录中。如果用户主目录下不存在.ssh目录,说明SSH公钥-私钥对尚未创建。

创建公钥-私钥对

1
$ ssh-keygen

该命令会在用户主目录下创建.ssh目录,并在其中创建两个文件:

  • id_rsa:私钥文件。是基于RSA算法创建的。
  • id_rsa.pub:公钥文件。

分发公钥

创建了公钥-私钥对后,需要将公钥交给远程主机保管,这样才能在之后的登录实现无口令登录。如下命令,会将.ssh目录下指定的公钥文件拷贝至远程服务器。

1
$ ssh-copy-id -i .ssh/id_rsa.pub <user>@<server>

  • 该命令会提示输入用户user在server上的SSH登录口令
  • 此命令执行成功后,再以user用户用ssh命令登录server远程主机时,不必输入口令可直接登录
  • 该命令实际上是.ssh/id_rsa.pub公钥文件拷贝到远程主机server的user主目录下的.ssh/authorized_keys文件中,内容类似如下:
    1
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDHJu4oVxIbLS2LBH5wI7htvDxuIMZ5IFUaZjbWI8z...M4yGEWcr7OVPdQa4DIEbrrl8MzsAZ baochuquan@baochuquandeMacBoo    k-Pro.local

关于SSH主机别名

在实际应用中,有时需要使用多套公钥/私钥对。然而,上述创建公钥-私钥对的命令只会生成默认名为id_rsa的密钥对。

创建公钥-私钥对

为了创建不同的公钥/私钥对,在使用ssh-keygen命令时就需要通过-f参数指定不同的私钥名称。用法如下:

1
$ ssh-keygen -f ~/.ssh/<filename>

命令会在.ssh/目录下创建指定的公钥/私钥对:文件<filename>是私钥,文件<filename>.pub是公钥。

分发公钥

将新生成的公钥添加到远程主机登录用户主目录下的.ssh/authorized_keys文件中,就可以使用新创建的公钥建立到远程主机账户的无口令登录:

1
$ ssh-copy-id -i .ssh/<filename>.pub <user>@<server>

在有多个公钥/私钥对时,默认使用~/.ssh/id_rsa.pub。那么如何使用新建的公钥连接server呢?

管理本地私钥

SSH的客户端配置文件~/.ssh/config可以通过创建主机别名,连接主机时选择用指定的私钥。例如/.ssh/config文件中的下列配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 使用默认的id_rsa私钥
Host gerrit.zhenguanyu.com
Hostname gerrit.zhenguanyu.com
Port 29418
User baocq

# 使用指定的chuquan01私钥
Host chuquan
user root
hostname 115.28.167.128
port 22
identityfile ~/.ssh/chuquan01

# 使用指定的gerrit01私钥
Host gerrit
user gerrit
hostname 115.28.167.128
port 22
identityfile ~/.ssh/gerrit01

无口令远程登录

执行下面的SSH登录命令,即可登录Host为chuquan的主机:

1
$ ssh chuquan

(完)

参考

  1. Secure Shell
  2. SSH原理与运用(一):远程登录
  3. SSH原理与运用(二):远程操作与端口转发
  4. 《Git权威指南》,蒋鑫
欣赏此文?求鼓励,求支持!