我在运行Linux Mint 13的桌面上初始化了一个本地git存储库。要推送到Assembla上的存储库,我需要一个ssh密钥。
我首先尝试在终端中生成一个新的密钥:
$ ssh-keygen -t rsa
答案是:
Enter file in which to save the key (/home/ryan/.ssh/id_rsa):
我试过"gitrep"。然后我收到以下消息。
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
我把它们留空,因为据我所知,它们是可选的,但为了记录在案,添加密码短语不会改变结果。然后
Your identification has been saved in gitrep.
Your public key has been saved in gitrep.pub.
The key fingerprint is:
da:80:b9:c5:cd:50:9c:1c:49:7f:b7:db:71:92:1e:6a ryan@ryan-MS-7309
The key's randomart image is:
+--[ RSA 2048]----+
| +++ |
| .=. |
| . . . . |
| + + . . o |
| o + S =..|
| o + o =o|
| . . . E o .|
| . |
| |
+-----------------+
现在,我导航到home/ryan/.ssh/id_rssa,文件夹是空的,但奇怪的是。如果我再次使用它添加的密钥的相同文件名重复上述过程:
gitrep already exists.
Overwrite (y/n)?
我不明白发生了什么事。
我问题的下一部分是我应该如何处理这个生成的文件。我把它放在原处吗?我会把信息复制到Assembla上的某个地方吗。
如果我问这个问题的方式不符合实际流程,因为我对这个主题不是很熟悉,我提前道歉。
由于您刚刚输入gitrep
,它只是将其保存在当前目录中(从上面的示例来看,这显然是您的主目录)。
检查是否存在~/gitrep
和~/gitrep.pub
。当gitrep.pub
文件要求您提供公钥时,您需要将其内容复制到目的地。
原始海报状态(强调矿):
然后我收到以下消息。
Enter passphrase (empty for no passphrase): Enter same passphrase again:
我将它们留空,因为据我所知,它们是可选的,但仅作为记录,添加密码短语不会更改结果。
我不同意添加密码将加密您的私钥,这样,如果有人设法从您的计算机中窃取您的私钥文件,如果没有解密密码,他们仍然无法读取和使用它。
您说得对,添加密码短语是可选的,但强烈建议使用。
为了说明差异,让我们假设您的未加密私钥文件内容(没有密码)如下所示(示例改编自改进SSH私钥文件的安全性)
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEArCQG213utzqE5YVjTVF5exGRCkE9OuM7LCp/FOuPdoHrFUXk
y2MQcwf29J3A4i8zxpES9RdSEU6iIEsow98wIi0x1/Lnfx6jG5Y0/iQsG1NRlNCC
aydGvGaC+PwwWiwYRc7PtBgV4KOAVXMZdMB5nFRaekQ1ksdH/360KCGgljPtzTNl
09e97QBwHFIZ3ea5Eih/HireTrRSnvF+ywmwuxX4ubDr0ZeSceuF2S5WLXH2+TV0
... etc ... lots of base64 blah blah ...
-----END RSA PRIVATE KEY-----
存储在私钥中的这个值可以用来向您将公钥提供给的任何第二方(在本例中为Assembla)模拟您自己。这基本上就好像黑客窃取了你账户的密码,并用它来登录你。。。在SSH世界中,这与之相当。
现在,让我们假设一下,如果你用密码短语加密了上面的同一私钥,那么文件内容会是这样的(再次改编自改进SSH私钥文件的安全性):
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,D54228DB5838E32589695E83A22595C7
3+Mz0A4wqbMuyzrvBIHx1HNc2ZUZU2cPPRagDc3M+rv+XnGJ6PpThbOeMawz4Cbu
lQX/Ahbx+UadJZOFrTx8aEWyZoI0ltBh9O5+ODov+vc25Hia3jtayE51McVWwSXg
wYeg2L6U7iZBk78yg+sIKFVijxiWnpA7W2dj2B9QV0X3ILQPxbU/cRAVTd7AVrKT
... etc ...
-----END RSA PRIVATE KEY-----
你看到内容与未加密的文件有什么不同吗?这使得你的私钥对任何碰巧窃取它的人来说都是无用的,除非他们碰巧也有密码将其解密回未加密的形式。
这就是GitHub给出的为什么你需要一个私人SSH密钥的密码短语的原因:
密码不是很安全,你已经知道了。如果你使用一个容易记住的,它更容易猜测或暴力。如果你使用的是随机的,很难记住,因此你更倾向于写下密码。这两件事都很糟糕™.这就是您使用ssh密钥的原因。
但是,使用没有密码短语的密钥基本上与在计算机上的文件中写下随机密码相同。任何能够访问您的驱动器的人都可以访问您使用该密钥的每个系统。这也是一件非常糟糕的事情™.解决方案是显而易见的,添加一个密码短语。
在同一篇帮助文章中,他们解释了如何使用*nix实用程序ssh-agent
在终端会话期间自动存储密码短语,这样您就不必每次使用私钥发出SSH请求时都不断输入密码短语。
当您执行此步骤时:
"输入保存密钥的文件(/home/ryan/.ssh/id_rsa):"
您应该接受默认设置,并将密钥保存在.ssh文件夹的主目录(/home/ryan)中作为id_rsa。然后您的公钥将位于/home/ryan/.ssh/id_rsa.pub<---此密钥是您要上传到您的Assembla帐户的密钥。
既然您已经将ssh密钥存储在默认位置,您就不必做任何其他事情来使用它
将其上传到您的Assembla帐户后,您将能够gitclone:
git克隆git@git.assembla.com:repo_name
当您回答"gitrep"时,您将保存该文件的密钥,在您当前的目录中,我假设是home-dir(/home/ryan)。