1.SSH协议简介

SSH是securityShell的缩写,他也属于安全传输协议的一种。但是与ssl不同的是,它一般是用来做远程登录的。并且他也没有用到ssl协议里面用到的数字证书,但是它和ssl相同点就是两者都使用了非对称加密并且两个协议都是位于传输层和应用层之间的协议。

2.两种远程登陆的方式

1.使用ssh密钥认证

第一种方式就是不用通过密码登录,但是需要远程登录端生成一个ssh密钥。比如我使用的xshell连接工具。我们需要首先通过xshell工具生成用户密钥。流程是点击工具,点击第四个出现下图

ssh 通过pem文件登录服务器_私钥验证

点击新建用户密钥成向导  

ssh 通过pem文件登录服务器_私钥验证_02

点击生成,继续点击下一步,用户名和密码可填写可不填,主要看你对安全的要求。

ssh 通过pem文件登录服务器_私钥验证_03

这样就生成了远程登录端的密钥。然后回到主机这边。

我使用的是阿里云服务器,就按照这个举例子了。首先进入到/etc/ssh 目录,下面有一个ssh_config文件,编辑这个文件

找到 RSAAuthentication,把后面改成yes。有的也可能是默认开启的。大家注意到下面有一个password开头的,这个就是是否允许密码登录,就是下面介绍的。然后里面可以通过AuthorizedKeysFile 这个选项来配置已经授权的密钥的文件位置,这个可以自己配置。我的配置是.ssh/authorized_keys,然后编辑authorized_keys这个文件(没有的话通过vi命令创建文件),把上面生成的密钥复制到这个文件里面。然后就是配置相关文件的权限,ssh对文件的权限管理很严格。上面的authorized_keys的权限必须是600(所有者具有读写权限)。.ssh文件的权限是700(所有者具有执行好和读写权限)。相关的权限配配置之后,在使用service sshd restart来重启ssh服务。这样当远程登录段登陆的时候,主机就会去authorized_keys文件里面查看是否有对应的密钥,有的话会生成随机数R,并用Client的公钥对该随机数进行加密,然后将加密后信息发送给Client,Client端通过私钥进行解密得到随机数R,然后对随机数R和本次会话的SessionKey利用MD5生成摘要Digest1,发送给Server端。Server端会也会对R和SessionKey利用同样摘要算法生成Digest2,最后比较Digest1和Digest2是否相同,完成认证过程

2.使用用户密码登录

这种登录方式的主要的工作是在远程主机上面完成的。在远程主机上执行 

ssh-keygen -t rsa -P "***" -f  root/.ssgh/id_rsa  生成密钥

-t代表生成密钥的种类

-p表示是否启用密码验证

-f表示生成的私钥的文件的位置,生成的公钥会自动在私钥的文件后面加上_pub。

生成之后客户端再连接主机的时候,主机会把公钥发送给客户端,然后客户端可能会收到这样一条提示,已经把当前主机加入到known_host里面,这个文件会记录你访问的所有的主机的公钥。作用就是客户端对主机进行安全验证,当下次连接相同的主机的时候,客户端会验证主机的公钥是否发生变化,如果发生变化,就会对用户提出警告。文件的位置一般在~/.ssh/known_hosts。然后用户名输入密码和账号,客户端会把这部分信息通过主机的公钥进行加密发送给主机,主机用私钥进行解密并且验证用户名和密码从而确定远程主机是否可以登录。