1)创建其他用户



useradd [-d 登录目录] [-G ssh][用户名] 



一定要将用户添加到ssh组不然无法没有权限登录ssh



2)设置ssh不允许root登录



vi /etc/ssh/sshd_config



找到 PermitRootLogin yes



修改为PermitRootLogin no



并在尾部添加 AllowUsers  [用户名列表]



然后重启ssh服务,/etc/init.d/ssh restart



3)如何使用公钥认证

先解释下什么是公钥密钥:



公钥私钥是不对称加密方式,公私钥的本质都是密钥,公钥是可以公开的代表用户信息的一个数字证书,私钥是用户公钥对应的一个的密钥。公钥可以公开,密钥一定要自己保存好不要泄露。两个密钥是互解的关系,即用公钥加密的内容只能用私钥解密,用私钥加密的内容只能用公钥解密。



公钥可以让任何人知道,因为它是代表用户信息的一个签章。



比如A公开了它的公钥,其向B发送了一个信息,这个信息用A的私钥加密的,B用A的公钥解密出这个信息,就说明信息是来自A的。



又比如A想发送一个只有B能解密出的信息,则A用B的公钥加密信息,然后发送给B,则只有B能解密出信息,因为只有B有它的公钥对应的密钥。



 



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 加密。
  1. 认证
  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),两者相同则认证成功

根据wiki的解释:

Android api公钥 公钥授权_Android api公钥

实际上,在客户端请求连接服务端的时候,客户端将Ac告诉了服务端,并且服务端会在请求登录用户目录下的./ssh/authorized_keys  查找是否有这个Ac,如果没有,则认为是非法的连接,后续的认证就没有了。



ssh公钥认证的使用:



客户端产生公密钥对,将客户端的公钥添加进服务端用户的ssh认证中。具体操作:



首先  ssh-keygen 命令产生公私钥对(客户端linux),或者使用window的ssh客户端如secureCRT,putty等生成



然后 将第一步生成的公钥id_rsa.pub 上传到 服务端,接着 cat id_rsa.pub >> 用户目录/.ssh/ authorized_keys  将公钥添加进认证中



第一步生成的密钥放在本地用于跟远程主机的认证



 



 



参考阅读:

1.数字签名是什么?

2.SSH原理与运用(一):远程登录

3.ssh登录过程详细介绍