作者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
1F:→ ssccg:公钥与私钥之间没有数学上的关系?? 08/09 19:48
2F:推 banjmin:质疑同楼上 rsa两个大质数 同余 费马小定理不是数学吗? M 08/09 20:07
3F:→ banjmin:iller-Rabin Primality Testing不是数学吗?分享公开金钥 08/09 20:07
4F:→ banjmin:原理是好事 但是不要误导 08/09 20:07
5F:→ kuso0516:可能是想说只有公钥没办法用数学的方式推导出私钥是哪只? 08/09 22:30
6F:→ DrTech: 这是不懂还是为了让初学者了解,而简化太多观念阿 08/10 01:20
7F:→ DrTech: 整篇文章完全忽略 Mutual Authentication,别人发的 08/10 01:21
8F:→ DrTech: Public key ,完全不做身分验证。 08/10 01:21
9F:推 DrTech: 用公钥来判断是否为冒牌货的言论更是误导。公钥是公开的 08/10 01:26
10F:→ DrTech: 任何人都可取得。 08/10 01:26
11F:→ neversay: 没有数学关系这句话我拿掉重回好几次......我比较想表达 08/10 02:34
12F:→ neversay: 的是只有暴力法才能从公钥推出私钥 08/10 02:34
13F:→ neversay: (在理想情况上) 08/10 02:34
14F:→ neversay: 回DrTech大: 我把与SSH server一开始的双向认证略过, 08/10 02:45
15F:→ neversay: 因为在做金钥认证的设定之前双向认证应该就做完了 08/10 02:46
16F:→ neversay: 要不然也没办法登入远端server放authorized_key 08/10 02:46
17F:→ neversay: 如果要把最初的双向认证加进来会复杂,所以简化了 08/10 02:53
18F:→ neversay: 至於用公钥验证冒牌货,是基於两种情形: 08/10 02:54
19F:→ neversay: 1.给不符合的公钥,系统会直接拒绝剩下的步骤,改用 08/10 02:54
20F:→ neversay: 传统的帐号密码的方式,或者根本就拒绝连线 08/10 02:55
21F:→ neversay: 2.公钥Pa与主机上储存的一致,主机就会用演算法E加密 08/10 02:56
22F:→ neversay: 随机字串S变成E(Pa, S)传回给访客,然後访客必须用私钥 08/10 02:56
23F:→ neversay: Pa'解密还原出S,接着用server的公钥Pb也把S加密成 08/10 02:57
24F:→ neversay: E(Pb, S),传回给server。让server解密取回S 08/10 02:58
25F:→ neversay: 这样就证明了访客: 08/10 02:58
26F:→ neversay: 1.拥有与之前设定的一样的公钥 08/10 02:59
27F:→ neversay: 2.该访客拥有正确的私钥,所以真的是公钥的产生者。 08/10 02:59
28F:→ neversay: 换句话说谁都能用公钥Pa给server求取连线,但是只有 08/10 03:03
29F:→ neversay: 真正的私钥拥有者能够解密server给的随机字串 08/10 03:04
改掉公钥私钥间的数学关系的文字,还有改掉我自己的推文的错字 XD
※ 编辑: neversay (50.156.87.148), 08/10/2014 03:08:49
30F:→ ssccg: 可是用公钥基本上是由私钥推出来的 08/10 05:46
31F:→ ssccg: 想要表达公钥推私钥很困难就直接这样写,何必扯什麽数学关 08/10 05:46
32F:→ ssccg: 系,成对的公私钥本身就已经是数学关系了 08/10 05:49
※ 编辑: neversay (50.156.87.148), 08/10/2014 06:26:27
33F:→ neversay: 有道理,我把用词改掉...... 08/10 06:29
然後把公钥与冒牌货的字修掉,因为能不能验证是否冒牌要等到最後一步才知道。
※ 编辑: neversay (50.156.87.148), 08/10/2014 06:38:32
34F:→ DrTech: 感谢你的回应,让我更了解整个过程。 08/10 11:35
35F:→ neversay: 不客气 :P 08/10 11:55