Mac下git通过SSH进行免密码安全连接github

Git——The stupid content tracker(傻瓜内容跟踪器)

gitLinux的缔造者Linus Torvalds为了帮助管理linux内核源码而开发的一款免费、开源的分布式版本控制系统。
分布式Git相比集中式CVS/SVN的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库。
如果用CVCS的话,差不多所有操作都需要连接网络;Git中的绝大多数操作都只需要访问本地文件和资源,由于本地磁盘上就保存着所有当前项目的历史更新,因此可以不用联网且处理起来速度很快。

大多数 Git 服务器都会选择使用 SSH 公钥来进行无密码登录连接。

SSH——Secure SHell(安全外壳协议)

SSH是建立在应用层和传输层基础上,默认端口是22,为远程登录会话和其他网络服务提供安全性的协议。SSH是替代Telnet(默认端口是23)和其他远程控制台管理应用程序的行业标准。

SSH服务最早是由芬兰的一家公司开发的UNIX系统上的一个程序,后来迅速扩展到其他操作平台,现在已经发展到SSH2版本。SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。由于版权和加密算法等因素的影响,很多人开始转用开源免费的openSSH(Linux/Mac OS X标配)。

SSH提供基于密钥的认证机制,你必须为自己创建一对非对称密钥(public/private key pair),并把公钥放到需要访问的服务器上进行授权。SSH1使用RSA(RonRivest、AdiShamir、LeonardAdleman)加密密钥,SSH2使用DSA(Digital Signature Algorithm,数字签名算法)密钥保护连接和认证。RSA和DSA这两种加密算法都是非对称加密算法

所谓“SSH公钥认证免密码登录认证机制”,原理如下:

(1)SSH客户端提前将SSH公钥储存在远程SSH服务器上,然后SSH客户端携带公钥向远程SSH服务器(known_hosts)发起登录请求。

(2)远程SSH服务器收到该请求之后,先在该服务器上的authorized_keys寻找你上传授权过的公钥,然后把它和你发送过来的公钥进行比较。

(3)如果两个公钥一致(Key Exchange Success),远程SSH服务器会向用户发送一段使用SSH公钥加密过的随机字符串进行身份质询(Challenge)。

(4)SSH客户端用自己的私钥解密后再发回给远程SSH服务器,远程SSH服务器对比回包中解密出来的随机字符串是否一致。如果一致,则证明用户(公钥或身份)是可信的,直接允许登录shell,不再要求密码。

 

Mac上预装的git和OpenSSH

 

1.使用ssh-keygen命令生成key pair:

--------------------------------------------------------------------------------

$ssh-keygen -t rsa -C "${YourEmail}"                                       # "-t rsa"表示使用密钥的加密类型,还可以为dsa;-C设置注释文字,比如你的邮箱“YourEmail”,不一定要是github注册邮箱
Enter file in which to save the key (/Users/faner/.ssh/id_rsa): # 直接回车
Enter passphrase (empty for no passphrase):                          # 输入密钥文件授权密码
Enter same passphrase again:                                                  # 确认密钥文件授权密码
Your identification has been saved in /Users/faner/.ssh/id_rsa.

Your public key has been saved in /Users/faner/.ssh/id_rsa.pub.

--------------------------------------------------------------------------------

此时,敲入ls命令可以看到ssh-keygen在~/.ssh目录下生成的public/private key pair,其中id_rsa为密钥对中的私钥,需妥善保管;id_rsa.pub为密钥对中的公钥,可任意公开。

RSA是一种支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的。DSA(Digital Signature Algorithm,数字签名算法)是一种标准的DSS(数字签名标准)。

id_rsa私钥类似keychain进行CSR时生成的private key;id_rsa.pub公钥则类似CSR申请下来的开发证书(在Apple Member Center中有在线备案)。

通过cat命令可以查看id_rsa.pub内容。


 

2.在github上为当前账号添加SSH公钥:

(1)这里Add SSH Key相当于注册到SSH服务器(github.com)的受信任列表(authorized_keys)中。


(2)SSH服务器受信任列表(authorized_keys中可以添加多个SSH客户端的公钥,其中title用于做简单识别,真正起识别作用的是公钥指纹(RSA key fingerprint)。


(3)向SSH服务器(github.com)Add自己的SSH Public Key后,github.com将这个SSH Key与你的github账号关联起来,你的机器(Mac git client)将有写权限向你github账号名下的remote repository进行push提交代码。


 

3.测试与github服务器的SSH连接:

(1)当没有使用ssh-keygen生成公钥时,执行ssh -T git@github.com,将会提示can`t be estabblished for permission denied without public key(SSH不支持匿名访问):

【1】Are you sure you want to continue connecting (yes/no)? yes#接受认可远程主机的公钥(可以核对官方给出的公钥指纹)。

【2】Warning:Permanently added ‘github.com, 192.30.252.128’(RSA) to the list of known_hosts. #github.com服务器主机已经得到认可被添加到~/.ssh/known_hosts中,可以执行cat known_hosts查看该文件。

(2)本机通过ssh-keygen生成公钥后,执行ssh -T git@github.com:

(1)Permanently added the RSA host key for IP address‘192.30.252.131’to the list of  known hosts:github.com(192.30.252.131)被添加到~/.ssh/known_hosts中。可以执行cat查看~/.ssh/known_hosts文件,实际上保存的是github.com的SSH RSA公钥(格式类似id_rsa.pub中的ssh-rsa ...),也即SSH客户端(本机)和SSH服务器(github.com)之间相互交换了SSH公钥。下次再连接github.com,系统认出它的公钥已经保存过本地了,从而跳过警告部分。

(2)提示“Saving password to keychain failed”:是因为没有勾选【在我的钥匙串中记住密码】。勾选之后重新测试

(3)提示“Hi !You've successfully authenticated”:表明你已经成功为本机设置SSH密钥对,且与github服务器身份校验通过。

(4)提示“but GitHub does not provide shell access”是因为github提供的HTTPS方式,而不是SSH方式,查一下你设置的git库的remote url,看看使用的是哪种连接方式。

(5)可以添加-v开关(ssh -vT git@github.com),打开Verbose模式,SSH在连接过程中将打印debug1级别的调试跟踪信息。

(6)如果使用了VPNGreenVPN)或ProxyGoAgent/TOR),可能导致访问github时,Chrome浏览器将提示【此网站的安全证书存在风险】而连接失败(ERR_CONNECTION_REFUSED)。

这可能是被邪恶的中间人GFW盯上了,篡改了github的证书。Chrome使用的是操作系统的证书体系,因此可到Mac OS X的Keychain Acces中删掉系统根证书(CNNIC证书清除方法 - RevokeChinaCerts)中的CNNIC根证书注意删除根证书会连带删除各级衍生子证书,故此举需谨慎)。恢复了“良民”身份后,重新访问github,Mac系统会重新下载CNNIC根证书以及GitHub证书洗白身份,又可以访问了github.com网站了!更坚决一点的做法是在钥匙串-系统根证书中双击CNNIC ROOT,在【信任】|【使用此证书时】下拉选择【永不信任】。

参考:

GitHub 和中间人攻击》《github.com的证书变自签名了?

github.com使用了无效的安全证书》《github 访问超时使用goagent解决方案

4.git clone下载开源git库Reachability

(1)Add SSH Key to GitHub后,登录github,在github开源项目网页中有三种Clone URL:

 

  • Subversion Clone URL,即工程github网页地址:https://github.com/tonymillion/Reachability,可通过subversion客户端进行checkout。
  • HTTPS Clone URL:https://github.com/tonymillion/Reachability.git,可通过git客户端clone版本库,需要输入账户密码。
  • SSH Clone URL:git@github.com:tonymillion/Reachability.git,可通过git客户端clone版本库,基于SSH公钥认证免密码输入。

 

若没有登录github.com,或登录但没有添加SSH Key,将没有SSH Clone URL。

(2)在Mac Terminal中使用"git clone${SSH url}"命令克隆git版本库到本地目录(~/Projects/git)。

 

参考:

 

git和svn之间的五个基本区别》《git和svn的比较

git和svn的详细比较》《git替代svn的可行性分析

 

SSH在linux安全中的作用》《SSH配置讲解大全

RSA算法原理(一)》《RSA算法原理(二)

SSH原理与运用(一)》《SSH原理与运用(二)

SSH和SSH2》《使用SSH公钥实现免密码登录

Git使用SSH公钥进行认证连接》《使用SSH密钥连接github

 

Git基本知识及MAC安装使用》《Mac下git与github的简单使用

Mac下的Git客户端》《在Xcode中配置使用Git

理解 Xcode 中的 Git 版本控制》《在Xcode中使用Git进行源码版本控制

 

Git教程-使用GitHub》《从github下载某个git库的四种方法

 

 

原文地址:http://blog.csdn.net/phunxm/article/details/45083335

 

 

posted @ 2017-08-07 12:41  SUPER_F  阅读(3242)  评论(0编辑  收藏  举报