快速开始
检查PC端是否存在ssh,如果不存在就创建一个类型为rsa,并且注释为“xxx@xxx.com”的ssh密钥。复制密钥字符串。最后当然是在服务端添加一个ssh key了。
cat ~/.ssh/id_rsa.pub
ssh-keygen -t rsa -C "xxx@xxx.com"
cat ~/.ssh/id_rsa.pub
Windows:
clip < ~/.ssh/id_rsa.pub
Mac:
pbcopy < ~/.ssh/id_rsa.pub
GNU/Linux (requires xclip):
xclip -sel clip < ~/.ssh/id_rsa.pub
SSH UML
文件概述
ssh-keygen命令用于为“ssh”生成、管理和转换认证密钥,它支持RSA和DSA两种认证密钥。
** ssh-keygen 选项 **
-b:指定密钥长度;
-e:读取openssh的私钥或者公钥文件;
-C:添加注释;
-f:指定用来保存密钥的文件名;
-i:读取未加密的ssh-v2兼容的私钥/公钥文件,然后在标准输出设备上显示openssh兼容的私钥/公钥;
-l:显示公钥文件的指纹数据;
-N:提供一个新密语;
-P:提供(旧)密语;
-q:静默模式;
-t:指定要创建的密钥类型。
id_rsa和id_rsa_pub
调用ssh命令 ** ssh-keygen -t rsa -C “xxx@xxx.com“ ** ,默认会生成id_rsa和id_rsa_pub两个文件。id_rsa是客户端的私有密钥文件,id_rsa_pub是客户端私有密钥根据一定的加密原则生成的公有密钥,保存于服务器。当然如果要对多个服务端进行配置ssh,我们可以自定义生成的密钥文件名。调用**ssh-keygen -t rsa -f ~/.ssh/your_ssh_key_name -C “xxx@xxx.com“ **,具体可以参考上述ssh-keygen命令。
常见问题
1.** git@xxx.com 输入密钥 **
当你键入 ssh -T git@xxx.com 这条命令之后,程序提示要你输入 git@xxx.com 的密码,那不用想了,程序没找到你的私有密钥。在哪些情况下会这样呢?
我们在生成这两个密钥的时候,程序可能没有帮我们在根目录下(C:/Users/yourName)新建一个 .ssh/ 文件夹,而他在建立连接的时候会默认寻找 ~/.ssh/id_rsa,如果没有新建一个这样的文件夹很显然是找不到的。你可以在根目录下通过命令行来新建一个文件夹
mkdir .ssh
之所以要用命令行是因为有时候浏览器不让你在文件夹名第一位放点号。
当然也有可能是因为你没有把创建的两个密钥放到 .ssh/ 目录下,而是直接扔在根目录下。
2.** Host key verification failed **
“Host key verification failed.” 相信你也撞到了这个问题,主机的密钥验证失败,主机就是你的机器,密钥验证失败有两个原因,一个是 RSA 做了更改,另一个原因是在 known_hosts 中存在一个缓存的记录,如果确认了 RSA 没有错误,那你就应该去 known_hosts 中删掉对应的那个记录(这个记录可以当做是缓存,是对验证做了一次缓存,缓存的作用是减少验证次数,不需要每次都验证,读取缓存就行了)。
当然,你也可以直接删除这个 known_hosts 文件。
3.** Permission denied (publickey) **
“Permission denied (publickey).” 这个问题其实和上面的 2 差不多,当你出现过 “Host key verification failed.”,然后继续执行程序,如执行 ssh -T git@xxx.com 的时候就会出现这个问题提醒。说到底就是没有找到你的 rsa 私有密钥,或者 rsa 密钥匹配出错。
Windows坑
1.** 找不到根目录 **
生成密钥默认放在 “/.ssh/“ 下,但是在 cmd 下操作会找不到 “/“ 这个根目录,因为这是 windows 不是 linux/unix,有些童鞋可能装了 cygwin,在这个环境下操作可以 “cd ~”,git bash 下当然也是可以的。
如果不知道有这个问题的存在,你会碰到上述问题一,程序直接让你输入密码,但不过你输入什么密码都是错误的。输入三次之后状态为 Permission denied,这里的原因就是没找到 ** /.ssh/id_rsa ** ,cmd 下她根本就不认识 “/“ 这个目录。
2.** 多个服务端的维护 **
很常见的问题。上面我们说到了,程序会默认寻找 ~/.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/ 目录中!
3.** 在某些CI环境中,按照上述方案处理了,依然报** Host key verification failed **错误。 **
这是因为在首次连接服务器时,会弹出公钥确认的提示。从而导致自动化任务中断。 SSH 客户端的 StrictHostKeyChecking 配置指令,可以实现当第一次连接服务器时,自动接受新的公钥。只需要修改 /your_user_name/.ssh/ssh_config 文件,包含下列语句:
Host *
StrictHostKeyChecking no
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 chgocn@gmail.com