SSH中的一些概念与使用方法
SSH既是协议的名称,也是程序的名称,SSH协议用于远程连接的加密通信,当我们需要登陆到远程服务器时,需要在本地机器和远程服务器之间传输数据,包括登陆的用户名和密码,需要执行的命令等,SSH协议先这些数据加密,然后进行传输,名为SSH的程序就是使用SSH协议进行远程通信的软件。
SSH程序分为客户端和服务器两种,SSH客户端位于本地机器,SSH服务器位于远程主机上,(现在的SSH程序一般将客户端和服务器集成在一个程序中),
SSH中的两个概念
SSH使用中需要明确两个概念,加密方法和认证方法,理解这两个概念便可以从容的使用SSH相关程序和用法了。
加密方法
加密方法是指SSH对远程通信传输的信息加密所使用的方法,SSH协议使用非对称加密。
首先说一说对称加密,用一个密钥(也就是一串字符)加密,用同一个密钥解密就是对称加密,这种加密方法不是十分安全,例如当发送方对数据加密,接收方对数据解密的情况,一旦发送方的密钥被盗,那么拿到密钥的人就可以用密钥解密数据。
非对称加密就避免了这种问题,非对称加密中加密和解密使用不同的密钥,加密使用公钥(public key),解密使用私钥(private key),两个密钥合称为一个密钥对(key pair),使用公钥加密的数据只能使用配对的私钥解密,并且私钥只能解密配对公钥的加密数据,使用非对称的加密方式,发送方用公钥加密,接收方用私钥解密,发送方的公钥被盗后,盗窃者由于没有私钥因此无法解密加密后的数据,这就提高了安全性。
SSH使用非对称加密的方法对远程通信的数据进行加密,从而一定程度的保证了通信中的数据的安全性。
认证方法
认证方法是指发送方和接收方彼此确认对方的身份,对于本地机器(一般作为发送方),需要确认目标的远程服务器是我想连接的那个服务器,对于远程服务器(一般是接收方),需要确认想要连接的人是服务器的一个用户。
本地机器认证服务器
当本地机器连接一个服务器时,用户有必要认证通信的服务器就是要连接的服务器,因为可能会有中间人伪装成远程服务器与你通信,认证的方法就是使用known_hosts,这个文件中存放的认证过的远程服务器的身份信息,每个远程服务器上的SSH服务器有唯一的身份信息,只要这个服务器的身份信息在known_hosts中,本地机器就认为这个服务器是可信的。在第一次连接一个以前未连接过的服务器时,SSH客户端会提示用户判断服务器的真实性,且询问是否确认连接,这时用户有责任判断服务器的真实性,一旦用户确认,便会将远程服务器的身份信息添加到known_hosts中,下次连接时便不再询问直接连接。
服务器认证用户
服务器也需要认证用户是否真的是该服务器的一个用户,认证方法有两种,第一种是用户名密码认证,第二种是密钥对认证。
用户名密码认证:服务器认为拥有正确用户名和密码的用户就是真正的用户,在使用这种方式认证时,服务器会要求用户提供该用户名登陆服务器所需的密码,密码正确则认为是真正的用户,认证通过。
密钥对认证:密钥对是唯一的一对一对应的,因此可以通过双方各持一个密钥的方法认证对方的身份,首先用户需要生成一个密钥对,将公钥放在服务器中,也就是将公钥写入authorized_keys文件中,因为只有真正的用户能够在服务器中写入文件,那么服务器有理由相信持有该公钥配对的私钥的人就是该服务器的真正用户。实际应用这种方法认证时,是SSH服务器生成一个随机数,将使用用户的公钥将随机数加密,然后发送给用户,SSH客户端使用用户的私钥解密得到随机数,将随机数进行一定的运算发回给服务器,服务器也对随机数做相同的运算,如果SSH客户端发回的结果和服务器自己运算的结果相同,就意味着客户端持有与服务器上公钥配对的私钥,从而身份认证通过。
SSH使用方法
用户名密码登陆远程服务器
使用如下命令即可使用SSH客户端登陆远程服务器,其中user是用户名,host是远程服务器的地址,一般直接使用IP地址,也可以使用域名。
ssh user@host
如果是第一次连接到的远程服务器,会提示用户判断服务器的真实性,用户确认后就会将服务器的身份信息添加到known_hosts文件中。
Linux下的使用方法参考 https://linux.die.net/man/1/ssh
生成密钥对
可以使用如下命令交互式的生成密钥对
ssh-keygen
Windows下的默认保存目录为 C:\Users\username/.ssh(路径中包含中文字符可能会导致该程序无法识别路径,从而生成失败)
Linux下的默认保存目录为 ~/.ssh
生成密钥的相关参数可自行查阅资料
使用密钥对认证登陆
想使用密钥对首先要将公钥写入服务器的authorized_keys文件中,Linux下该文件位于 ~/.ssh 目录中,可以直接将公钥的内容复制到该文件中,在authorized_keys中每个公钥都写在一个独立的行中。
也可以使用如下命令将公钥加入服务器的认证文件authorized_keys中
ssh-copy-id -i C:\Users\username/.ssh/id_rsa.pub user@host
其中-i参数表示公钥的路径,使用此参数时服务器会需要用户输入密码,这是因为需要想服务器的文件中写入内容,需要判断用户的真实性。
将公钥写入authorized_keys后,便可以使用密钥对认证的方式登陆服务器了,在登陆时不需要再次输入用户的登陆密码,可使用如下命令登陆
ssh -i C:\Users\username/.ssh/id_rsa user@host
其中-i参数表示私钥的路径,如果不指定私钥的路径,SSH客户端会在生成密钥对的默认路径中寻找默认命名的私钥,不会使用其他私钥,因此如果自行设定了密钥的存放路径或者没有使用默认名称,就应当指定私钥的路径,否则SSH客户端无法找到私钥,会回到使用用户名密码认证的方式登陆。
使用配置文件
无论是用密码认证还是密钥认证,输入的命令都需要包含用户名、主机地址、私钥路径等信息,使用配置文件可以简化命令的使用方式,将以上信息都存放再配置文件中,配置文件是 ~/.ssh目录下(Windows是C:\Users\username/.ssh)的config文件,可使用的基本内容如下
Host alias
HostName host
User user
Port 22
IdentityFile C:\Users\username/.ssh/id_rsa
其中alias是对连接起的别名,host是远程服务器的地址,user是用户名,IdentityFile是私钥的地址,如果不使用密钥认证或者使用默认的路径和默认的名称的私钥,则此行可以不写,Port是SSH服务器的端口号,使用默认值22则可以不写此行。更多配置文件的书写内容可以参考 https://linux.die.net/man/5/
设定配置文件后便可以直接使用如下命令代替原来的命令
ssh alias