本文同步自个人博客园:http://hustskyking.cnblogs.comlinux
主要是 windows 用户会遇到不少纠结的问题,linux/unix 用户属于这方面的高端用户,应该有能力处理此类问题,并且网络上也有不少解决方案,本文的受众是 windows 用户。因为今天配置了一下午,虽然说配置过程基本搞清楚,懒得从新配置一遍,因此文中皆以文字形式叙述,没有截图。git
网上很容易搜到的东西我就不说了,咱们知道,经过:github
ssh-keygen -t rsa -C "something"
能够生成两个文件,这两个文件的命名默认是 id_rsa 和 id_rsa.pub,若是你在键入上述命令回车以后,从新输入了命名,那此时生成的两个文件就是 [命名]
和 [命名].pub
,这个好理解。算法
主要是解释下生成了两个什么东西。id_rsa 能够称之为私有密钥,id_rsa.pub 能够称之为公有密钥。咱们会把公有密钥交给服务端,当须要从服务端请求内容的时候,要带上私有密钥。此时,服务器会经过必定的算法计算私有密钥,并判断计算的结果是否与公有密钥同样,若是不同则响应请求失败。windows
+-----------+ +-----------+ | | | | | | enc(rsa) == rsa.pub | | | client | ------------------------> | server | | | ? | | | | | | +-----------+ +-----------+
rsa.pub 里面是个什么东西,其实很简单:浏览器
ssh-rsa base64(加密内容) "something"
而 rsa 中是:缓存
-----BEGIN RSA PRIVATE KEY----- base64(私有密钥的一些处理) -----END RSA PRIVATE KEY-----
在使用 git 命令与服务端进行交互以前,咱们能够先验证下服务器和客户端是否握手成功了。bash
ssh -T git@xxx.com
若是是 github,就能够直接写 git@github.com, 若是是 aaa.bbb.com,就能够写 git@aaa.bbb.com。 若是成功,你会看到 success 之类的字眼。服务器
这是个什么文件呢?通常状况下 windows 下不会产生这个文件,先说说他是干什么的。当咱们成功与服务端进行链接时,ssh 会记录服务端的 Host、IP 以及 rsa 文件,当链接过程当中出现:网络
Permanently added '10.0.0.0' (RSA) to the list of known hosts.
若是你选择 Yes,那这个 known_hosts 文件中就会多出一条记录。windows 是不会自动产生这个文件的,也多是程序产生了,可是没权限写入,因此咱们没有在 .ssh/ 目录下看到这个文件。但若是咱们建立了这个文件,会发现里面的内容会随着咱们的验证慢慢增长。
搞清楚了这些概念,咱们再说说会遇到的问题。
当你键入 ssh -T git@xxx.com
这条命令以后,程序提示要你输入 git@xxx.com 的密码,那不用想了,程序没找到你的私有密钥。在哪些状况下会这样呢?
咱们在生成这两个密钥的时候,程序可能没有帮咱们在根目录下(C:/Users/yourName)新建一个 .ssh/ 文件夹,而他在创建链接的时候会默认寻找 ~/.ssh/id_rsa
,若是没有新建一个这样的文件夹很显然是找不到的。你能够在根目录下经过命令行来新建一个文件夹
mkdir .ssh
之因此要用命令行是由于有时候浏览器不让你在文件夹名第一位放点号。
固然也有多是由于你没有把建立的两个密钥放到 .ssh/ 目录下,而是直接扔在根目录下。
"Host key verification failed." 相信你也撞到了这个问题,主机的密钥验证失败,主机就是你的机器,密钥验证失败有两个缘由,一个是 RSA 作了更改,另外一个缘由是在 known_hosts 中存在一个缓存的记录,若是确认了 RSA 没有错误,那你就应该去 known_hosts 中删掉对应的那个记录(这个记录能够当作是缓存,是对验证作了一次缓存,缓存的做用是减小验证次数,不须要每次都验证,读取缓存就好了)。
固然,你也能够直接删除这个 known_hosts 文件。
"Permission denied (publickey)." 这个问题其实和上面的 2 差很少,当你出现过 "Host key verification failed.",而后继续执行程序,如执行 ssh -T git@xxx.com
的时候就会出现这个问题提醒。说到底就是没有找到你的 rsa 私有密钥,或者 rsa 密钥匹配出错。
生成密钥默认放在 "~/.ssh/" 下,可是在 cmd 下操做会找不到 "~/" 这个根目录,由于这是 windows 不是 linux/unix,有些童鞋可能装了 cygwin,在这个环境下操做能够 "cd ~",git bash 下固然也是能够的。
若是不知道有这个问题的存在,你会碰到上述问题一,程序直接让你输入密码,但不过你输入什么密码都是错误的。输入三次以后状态为 Permission denied
,这里的缘由就是没找到 ~/.ssh/id_rsa
,cmd 下她根本就不认识 "~/" 这个目录。
很常见的问题。上面咱们说到了,程序会默认寻找 ~/.ssh/id_rsa
这个文件,同一目录下显然不能有两个重名文件,也就是说当咱们去认证 github 和另一个 git 服务器的时候,咱们须要把两个 rsa 私有密钥的名字换来换去,想用谁就把谁改为 id_rsa。特别麻烦,那肿么办?
以前在网上看到说是对 ssh_config 进行配置,配置内容是:
Host github.com User boy-a IdentifyFile ~/.ssh/github Host xxx.com User boy-b IdentifyFile ~/.ssh/xxx
这里的 "~/.ssh/github" 和 "~/.ssh/xxx" 都是 rsa 文件,文件的命令能够直接改,也能够在开始生成的时候设定,命名对内容没有任何影响。项目的几行代码应该也是十分清晰的,针对不一样的 git 服务器,使用不用的 IdentifyFile。
可是你会发现,你的设置毫无用处,由于你把文件名搞错了!在 linux/unix 下多是使用 ssh_config 这个文件名,可是在 windows 下是使用 config 做为文件名放在 ~/.ssh/ 目录中!
这东西我纠结了一个下午,花了将近三个多小时才解决问题,真心快吐血了!说到底就是一个 config 的配置问题,遇到这种问题最快捷的方式并非在网上疯狂的搜索答案,而是静下心来看看 rsa | git | ssh 的基础知识,了解每一个参数及其用途,对症下药!