由于 git 大文件用 http 方式难以传输,必须使用 ssh-key,而 ssh-key 又生成了好多个。最近在各种折腾 ssh,公钥私钥上花费了很多时间,现将一些问题总结如下。系统为 Mac/Linux。
SSH之所以能够保证安全,原因在于它采用了公钥加密。
整个ssh密码登录过程是这样的:
在linux上,如果你是第一次登录对方主机,系统会出现下面的提示:
$ ssh user@host
The authenticity of host ‘host (12.18.429.21)’ can’t be established.
RSA key fingerprint is 98:2e:d7:e0:de9f:ac:67:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)?
这段话的意思是,无法确认host主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?
所谓”公钥指纹”,是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹。上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d
,再进行比较,就容易多了。
很自然的一个问题就是,用户怎么知道远程主机的公钥指纹应该是多少?回答是没有好办法,远程主机必须在自己的网站上贴出公钥指纹,以便用户自行核对。
假定经过风险衡量以后,用户决定接受这个远程主机的公钥。
Are you sure you want to continue connecting (yes/no)? yes
系统会出现一句提示,表示host主机已经得到认可。
Warning: Permanently added ‘host,12.18.429.21’ (RSA) to the list of known hosts.
然后,会要求输入密码。
Password: (enter password)
如果密码正确,就可以登录了。
原文:http://itindex.net/detail/48724-ssh-认证-原理
在命令行中,键入
ssh-keygen -t rsa -C "$your_email"
会生成一对密钥,默认的情况下,私钥将放在~/.ssh/id_rsa
,对应的公钥则为~/.ssh/id_rsa.pub
。
在生成的过程中,会询问你放密钥的位置。由于每个人可能不止需要一个密钥,所以可以另存为其他名字的密钥,比如path/to/your/dir/id_rsa_new
,此时它也将生成对应的公钥。
使用以下代码来查看生成的公钥
cat ~/.ssh/id_rsa.pub
将公钥复制到你需要的服务器上(比如 github,gitlab 等等)
如前文所说,如果我们需要多个密钥,那么在使用中,如何确定实际使用哪一个呢?
目前为止,ssh-key 用得最多的两个 地方,一是 git 相关服务,二是远程连接服务器。
用-i
指定私钥,-p
指定端口,连接服务器
ssh -i path/to/your/key developer@192.168.1.237 -p 23
scp -i path/to/your/key filename developer@192.168.1.237:/diskpath
由于 git 命令不能指定私钥,所以要通过 ~/.ssh/config 文件来控制。如果没有就在~/.ssh目录创建config文件,该文件用于配置私钥对应的服务器。比如:
Host github
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa
Host tsinghua
HostName tsinghua.edu.cn
User git
IdentityFile ~/.ssh/id_rsa_new
这样,链接到 github.com 时,使用的就是 id_rsa;链接到 tsinghua.edu.cn 时,使用 id_rsa_new。另外,Host 的名字可以随便设置,并且在 ssh 后面相当于 User@HostName,比如 ssh github
等价于 ssh [email protected]
。
如果工作中,你使用了一个没有密码的私钥,有一天服务器被黑了,你是跳到黄河都洗不清。而生成密钥时,往往会选择一个比较简单的密码。为了安全起见,还是应该修改一下:利用ssh-keygen -p
,系统会提示选择需要修改的私钥,默认是~/.ssh/id_rsa
,选好文件后按回车,会提示你输入旧密码,输入好后会提示输入新密码,则修改完成。