作者neversay (子不语)
看板Ajax
标题Fw: [技术]金钥认证设定好,远端登入没烦恼。
时间Sat Aug 9 19:36:52 2014
※ [本文转录自 Soft_Job 看板 #1JvWU5Tj ]
作者: neversay (子不语) 看板: Soft_Job
标题: [技术]金钥认证设定好,远端登入没烦恼。
时间: Sat Aug 9 19:35:30 2014
网志版 (运用贫瘠的美术能力想把金钥认证流程画出来 XD):
http://neversaycoding.tumblr.com/post/94238914127
最近在玩Github与线上IDE诸如Koding或Nitrous.IO,在玩这些平台的时候,常常
有些跨平台的需求,诸如:
* 想把Github上的专案抓进本机,然後修改後上传回Github。
* 想从线上IDE的虚拟机器里把Github上的专案抓下来修改并上传。
* 想要从本机用SSH登入Koding或Nitrous.IO等线上IDE的终端机。
总之,各种登入远端,或是把专案传到远端平台,其实都需要一些特殊设定才能达
成。这篇就来小记一下SSH金钥认证的原理跟设定。
---------------------------------------------------------------------------
首先,在设定SSH金钥前,我们最好对SSH的认证机制有些了解,这样才能在一堆设
定里面理清头绪,不被搞得昏头赚向。
SSH这个通讯方法底层使用的是不对称加解密演算法。跟一般对称加解密演算法用同
一把钥匙加解密不同,不对称演算法会产生两把钥匙,一把自己保管的私钥,一把可
以乱给人的公钥。
公钥加密的讯息只有私钥可以解密,反过来私钥加密的讯息也只有
公钥能解密。更奇妙的是,公钥加密的东西无法用公钥解密,私钥也是一样的情形。
而公钥与私钥之间没有数学上的关系,所以就算拿到公钥也没办法在合理时间内破解
出私钥是什麽。
而Github与各大线上IDE用的都是SSH协定,避免你与主机之间的资料不经加密在网路
上流传被他人拦截。(顺带一提,PTT等预设使用telnet协定的网站是没有加密的,
所以PTT的密码千万别跟重要网站的密码一致,否则被盗就惨了。)
而使用SSH来与远方的主机进行数据交换时,有两种认证方式:
第一种是帐号密码的验证法,每次使用者用SSH登入远端主机或从主机拷贝档案,就
必须输入帐号密码。这种方法的问题在於每次登入都必须输入密码,除了不方便之
外,让密码在网路上传来传去总是有点让人毛毛的,虽然这些密码都被加密了,但
是机敏资讯能够不外曝就不外曝。
第二种方式叫金钥验证法。要用这方法,使用者必须在自己的机器上也产生私钥与
公钥,然後把公钥摆在远端主机的指定位置上。由於第一次登入远端主机时就已经
得到了该主机的公钥,所以一旦你将你的公钥摆上去,就会形成双方都有对方的公
钥的情况,接下来就可以拿来做双方验证了。验证步骤是:
1.访客对远方主机发出请求,把访客的帐号与访客的公钥传给远方主机。
http://tinyurl.com/pgq42yx
2.远方主机根据帐号找到该访客之前上传的公钥做比对,如果完全一样就代表该访
客不是冒牌货。
3.远方主机随机产生一段暗号,用访客的公钥加密,把加密文字回传给访客。
http://tinyurl.com/qbuh4nr
4.访客用访客的私钥解密该暗号。
http://tinyurl.com/l543nyh
5.用远方主机的公钥加密同一暗号。
http://tinyurl.com/nr7ahh5
6.将加密暗号回传给主机。
http://tinyurl.com/p68dojb
7.远方主机用远方主机的私钥解密该段文字得到原本的暗号。这样主机就知道这个
访客拥有正确的私钥,身分确认无误。
http://tinyurl.com/nhjm8wh
整个流程使用者完全不用输入密码,双方在网路上传递的都是加密过的随机字串。
拦截者就算拦到了该字串也没多大用处,因为这明文没有包含任何机敏资讯。不能
用它来猜测破解私钥。
总而言之,金钥认证的方法关键在於双方都要有对方的公钥,而且自己的私钥不能
外流。这样的话就能做到不需要密码也能让双方互相认证。
-------------------------------------------------------------------------
接下来谈谈各个对开发者很重要的网路平台目前是怎麽使用金钥认证的。
首先,你必须生成私钥与公钥,如果你是使用MAC或Linux,那将SSH套件安装好之後
就可以用鸟哥的私房菜或Github的说明页提到的方法产生公私钥,如果是Window则
要用这里(
http://www.vixual.net/blog/archives/190 )提到的方法产生。
在Github等平台上想把自己的专案抓下来本机电脑,修改再上传,就必须经过认证
步骤,而Github的认证方法就是使用金钥认证。
1.当公私钥产生完成後,你会在特定的档案位置看到公钥,例如Linux/MAC上公钥储
存在 ~/.ssh/id_rsa.pub 或者 ~/.ssh/id_dsa.pub 里面,看你当初是用哪个演算
法产生金钥。然後登入Github,在右上的选单列选择”Account Setting”进入帐号
设定。
2.在帐号设定里面左方选单选择”SSH Keys",接着选择"Add SSH key",把公钥字
串整个复制贴上,再按下"Add key"就完成了。
3.设定完成後,理论上从你的电脑向Github的读取(git pull)与修改(git push)
指令都不会被存取拒绝。
4.如果你有在使用线上IDE配合Github的话,通常线上IDE的虚拟机器也会事先产生
公私钥,以利使用者设定金钥认证。下图就是我的Github上储存的公钥,从我的
电脑、Koding的虚拟机器以及Nitrous.IO的虚拟机器上各一把:
http://tinyurl.com/n42mkel
------------------------------------------------------------------------
金钥认证的另一种用法,就是让线上IDE的使用者可以从本机电脑登入线上IDE产生
的虚拟机器。毕竟对程式的老手来说,有时候直接远端登入SSH会比从网页浏览器
的终端机介面来得快,反应也比较迅速。
(浏览器有时候会顿顿的,且在不同页面切换有时要靠滑鼠点来点去有点烦。)
在线上IDE的设定方法跟Github类似,只要找到相对应的设定页面,把自己电脑产
生的公钥设定进去就好了。
Koding的设定说明页面在这里
(
http://learn.koding.com/guides/ssh-into-your-vm/ )。
而Nitrous.IO的设定页面在这边(
http://help.nitrous.io/ssh-add/ )。
这样,不知道大家是否对SSH等的金钥认证的原理,还有它现今在网路服务的应用
有了认识?
Happy Coding Day!
参考资料:
JosephJ的进阶说明:
http://josephj.com/article/understand-ssh-key/
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 50.156.87.148
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1407584133.A.76D.html
※ 发信站: 批踢踢实业坊(ptt.cc)
※ 转录者: neversay (50.156.87.148), 08/09/2014 19:36:52