Fork me on GitHub

SSH学习和github的SSH配置

SSH

简单来说,SSH是一种网络协议,用于计算机之间的加密登录。
如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。
最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。

需要指出的是,SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。比如OpenSSH,它是自由软件,应用非常广泛,如果你安装了git的客户端,默认情况下也就安装了ssh软件,所以,如果你电脑上可以打开git bash的话,则就可以使用ssh了。

在git bash界面中,输入 ssh,会有如下提示:
图示
说明,你的电脑上已有ssh软件,如果你本身是Linux系统的话,则一般自带ssh软件的,那就无需独立安装了。

SSH介绍

我们知道,ssh只是一种网络通信协议,遵守这个协议的软件叫ssh软件,它有服务端和客户端,它默认采用22端口通信,大多数Linux服务器都有ssh的服务,所以,我们想要通过ssh协议登录到有ssh服务的主机中,只需要有ssh客户端就行.
在Windows下,有像Putty、Xmanager 这样的软件,支持SSH协议去远程登录到Linux主机,那ssh是怎么做到安全的呢?

每台使用ssh协议的主机都可以生成一对密钥,可以采用不同的算法来生成,比如有:RSA, DSS等不同算法来生成密钥,这一对密钥又分为公有密码[public key]和私有密钥[secret key], 这对密钥的特点是,公钥加密的数据可用私钥来解密,反过来,使用私钥加密的数据可用公钥来解密, 所以,我们就有两个选择,是采用公钥加密还是采用私钥加密, 下面我分开来讲述一下:

一般来说,采用私钥加密都比公钥加密快,所以,大数据量的加密一般都会使用私钥加密,而公钥加密会作为身份验证和交换私钥的一个手段。
现在我们来看一下这个通信过程,假设以github为ssh的服务端,服务端有它的公钥和密钥,你的电脑为ssh客户端,你有你的公钥和密钥。
当然,事先我得在github上添加我的公钥,以便我用私钥加密的数据,github能用我给他的公钥去解。

第一步,你发出一个请求到github上,为防止中间人攻击,第一次github上会把它的公钥采用哈希算法转换成一串字符串,询问你是否确定是连接到这个主机,确认后,就表示你同意,那github上的公钥就会写入到你的电脑中,存储在一个叫 known_hosts的文件中

第二步,现在你的电脑和github服务之间,各自拿到了对方的公钥,你们之间传递数据时,都用各自的私钥加密数据进行传输,这个过程即使被拦截也没有关系,由于你们各自的私钥都是非公开的,这就保证了传递的数据的安全性【没有私钥,解不了密】。

SSH在本地的配置

有了上面的知识,我们大致了解了ssh的工作过程,那么,我如何生成一对密钥呢?

很简单,在git bash窗口中,执行如下命令:

  • Step1:
    1
    $ ssh-keygen -t  rsa -C "登录帐号"   //一般为邮箱[也就是你要登录到远程主机或服务的帐号]

接下来会有三次提示,如果不想改的话,直接回车即可。
成功创建后,在当前用户的主目录下会生成一个叫.ssh的文件夹,它里面有如下文件:
id_rsa 和 id_rsa.pub 两个文件,其中 id_rsa 存储私钥, id_rsa.pub 存储公钥

  • Step2: 执行 eval ssh-agent -s 返回代理的 pid
    1
    $ eval `ssh-agent -s`

成功后,会返回 pid

  • Step3: 把私钥添加到ssh中
    1
    $ ssh-add  ~/.ssh/id_rsa

完成后,你本地的ssh的一对密钥就算完成了,接下来,我们要把生成的公钥添加到 github 平台上你的帐号中去。

利用公钥登录github的配置

打开浏览器,输入https://github.com后,登录你的github帐号。
点击用户头像边上的下拉按钮,选择 Setting, 如下:
图示
然后,再选择SSH and GPG keys, 进入如下界面
图示
到了这个界面上,标题可以任意写,而内容就是要你事先生成的SSH的公钥.

到此,github拿到你的公钥,将来我们通过ssh与github交互时,就可以免用户名和密码了。

SSH中如何配置多个github帐号

一个人有时可能会有多个 github帐号,我们如何使用 ssh 在多个github帐号之间智能切换?

如果采用默认的ssh配置,则肯定只能配置一个帐号,因为默认情况下公钥和私钥 保存在一个叫 id_rsa的文件中,这个文件只能保存一个帐号。
那是否有解决方案?

答案当然是有的,如下:

  1. 在 ~/.ssh 目录下,新建一个 config 文件,内容如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # Work GitHub
    Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_work

    # Personal GitHub
    Host personal.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_personal

其中,# 打头的为注释,注意这里准备了两个不同的id_rsa文件,一个是工作的,一个是个人的。将来,我们通过ssh与目标主机通信时,需要指定不同的主机,如:

使用work 帐号与主机通信,则直接写:git@github.com
使用personal帐号与主机通信,则要写:git@personal.github.com

这里就是使用 host的名字不同,来告诉ssh,到底读取哪个 identifFile, 以获取此次通信的 id_rsa 公钥和私钥

  1. 其它的操作与单个配置一样,没有什么区别,也是如下命令:
  • Step1:
    1
    $ ssh-keygen -t rsa -C "邮箱"

需要注意的是,第一次的提示让你输入存储私钥的文件名,默认是:id_rsa, 你需要改为: id_rsa_personal, 以同 config 文件中的配置保持一致。这样一来,就会生成:id_rsa_personal和 id_rsa_personal.pub 两个文件。

  • Step2:

    1
    $ eval `ssh-agent -s'
  • Step3:

    1
    2
    $ ssh-add ~/.ssh/id_rsa_personal   
    $ ssh-add ~/.ssh/id_rsa

这里两个都要加入,成功后,通过ssh-add -l 命令可以看到有2个私钥添加到ssh列表中

然后,你要在github上的两个帐号都可各自设置 SSH KEY, 把各自的 idrsa[personal].pub 中的内容COPY到各自的设置中

最后,可以通过如下命令来测试:

1
2
ssh -T git@github.com   # 这个就是 work的, 因为在config文件中,work对应的 Host就是 github.com
ssh -T git@personal.github.com #这个就是 personal 的,因为在 config文件中, personal对应的Host 就是 personal.github.com

生成以上的两个不同github帐号的ssh密钥后,有如下文件:
图示
上面显示的_bella类似于_personal
上面的所有操作都是基于Windows平台上的,并基于git自带的ssh软件

到此,我们就可以在同一台电脑上,配置对个github帐号的ssh,通过不同的主机映射访问不同的帐号,而且都不需要密码。