ssh-key生成密钥及SSH无密码登录

介绍

首先什么是SSH

  Secure Shell (SSH) 是一个允许两台电脑之间通过安全的连接进行数据交换的网络协议。通过加密保证了数据的保密性和完整性。SSH采用公钥加密技术来验证远程主机,以及(必要时)允许远程主机验证用户。

SSH的好处

  • 传统的FTP、Telnet是再网络中明文传送数据、用户帐号和密码,很容易受到中间人攻击。而通过使用SSH,你可以把所有传输的数据进行加密,这样“中间人”这种攻击方式就不可能实现了, 而且也能够防止DNS和IP欺骗。
  • 传输的数据是经过压缩的,所以可以加快传输的速度。

怎么实现SSH的好处呢?

  SSH利用SSH Key来进行前面提到的基于密钥的安全验证。

SSH-Key是什么?

  • SSH-Key 就是一对密钥对。【一个是公钥,一个是私钥】
  • 公钥是给别人用的。私钥是给自己用的。
  • 别人是谁?可以是GitLab服务器。
    自己是谁?可以是本地。
  • 举个例子
    • 本地想要使用git从gitHub/gitlab上拉取代码。
    • 给GitHub/GitLab配置公钥,公钥就可以作为一个加密的箱子,将代码放在箱子里。
    • 被本地拉取到后,使用私钥将加密的箱子打开。就能拿到代码了。
    • 整个过程中,都没有用户名/密码在网络中传输,所以不会给他人拦截到,破解你的数据。
  • 所以,SSH-Key的直观作用,就是【让你方便的登录到 SSH 服务器,而无需输入密码】

SSH-Key的密钥类型

  有RSADSA两种认证密钥。

SSH-Key生成

是否已存在SSH-Key

ls -al ~/.ssh # 用户目录.ssh文件,是否有id_rsa/id_rsa.pub

   id_rsa (私钥,要保存好,放在本地,私钥可以生产公钥,反之不行。)
   id_rsa.pub (公钥,可以用于发送到其他服务器,或者git上。)

新生成SSH-key

ssh-keygen -t rsa -C "leeze0216@163.com"

-b:指定密钥长度;
-e:读取openssh的私钥或者公钥文件;
-C:添加注释;
-f:指定用来保存密钥的文件名;
-i:读取未加密的ssh-v2兼容的私钥/公钥文件,然后在标准输出设备上显示openssh兼容的私钥/公钥;
-l:显示公钥文件的指纹数据;
-N:提供一个新密语;
-P:提供(旧)密语;
-q:静默模式;
-t:指定要创建的密钥类型(如:rsa,dsa)。

   键入命令后,会让你输入密码用来保护你的密钥等,总共三次需要输入的,你都直接三次回车就好!!
  【关键是,设置了你自己以后忘了就得重新生成】
  【-C 是给你的密钥设置注释,你不想设置为邮箱,设置成别的也行】

   生成后,当前用户的目录下,生成一个.ssh隐藏目录,目录中会有【id_rsa】和【id_rsa.pub】两个文件,一个是私钥,一个是公钥。你现在就可以复制使用了。

上传公钥到服务器

id_rsa.pub (公钥)内容,写到服务器上的~/.ssh/authorized_keys文件里

  1. 上传方式
  2. 方式一:
       这里测试用的服务器地址为:10.211.55.61,用户为:root

    ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.211.55.61

      如果之前登录过,可能会报错,需清理known_hosts对应IP的值
    vi ~/.ssh/known_hosts      # 删除对应ip的相关rsa信息
    或者
    ssh-keygen -R 192.168.1.10 # 清除旧的公钥信息
    

      删除know_host.old

    方式二:
       将之前在本地生成的公钥id_rsa.pub,发送到需要无密码登录的服务器,然后将id_rsa.pub的内容追加到服务器的~/.ssh/authorized_keys文件中即可。

    $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
  3. 重启SSH服务
  4. $ service sshd restart
  5. 测试免密登录服务器
  6. ssh root@10.211.55.61

    ssh -o StrictHostKeyChecking=no 192.168.xxx.xxx

  7. 设置ssh无密码访问git仓库
  8. 将本地id_rsa.pub的内容添加到git仓库的 SSH公钥 中。

    测试ssh无密码访问git仓库:ssh -T git@gitee.com

Git配置多个SSH-Key

  1. 生成 gitee SSH-Key
  2. $ ssh-keygen -t rsa -C 'git@gitee.com' -f ~/.ssh/gitee_id_rsa
    
  3. 生成 github SSH-Key
  4. $ ssh-keygen -t rsa -C 'git@github.com' -f ~/.ssh/github_id_rsa
  5. 添加配置文件,在 ~/.ssh 目录下新建一个 config 文件
  6. # gitee
    Host gitee.com
    HostName gitee.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/gitee_id_rsa
    # github
    Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/github_id_rsa

    # 配置文件参数
     Host : Host可以看作是一个你要识别的模式,对识别的模式,进行配置对应的的主机名和ssh文件(可以直接填写ip地址)
     HostName : 要登录主机的主机名(建议与Host一致)
     User : 登录名(如gitlab的username)
     IdentityFile : 指明上面User对应的identityFile路径
     Port: 端口号(如果不是默认22号端口则需要指定)
  7. 测试
  8. $ ssh -T git@gitee.com
    $ ssh -T git@github.com