2

我在运行 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_rsa 文件夹是空的,但奇怪的是。如果我再次使用相同的文件名作为它添加的密钥重做上述过程:

gitrep already exists.
Overwrite (y/n)?

我不明白发生了什么事。

我的问题的下一部分是我应该如何处理这个生成的文件。我要把它留在原处吗?我是否将其中的信息复制到 Assembla 上的某个位置。

如果我以不遵循实际过程的方式提出问题,我提前道歉,因为我对这个主题不是非常熟悉。

4

3 回答 3

2

由于您刚刚进入gitrep,它只是将其保存在您的当前目录中(从上面的示例来看,这显然是您的主目录)。

检查并查看是否~/gitrep存在~/gitrep.pubgitrep.pub当它要求您提供公钥时,您需要将文件的内容复制到目的地。

于 2013-07-20T05:37:41.147 回答
1

当您处于此步骤时:

“输入保存密钥的文件(/home/ryan/.ssh/id_rsa):”

您应该只接受默认值并将密钥作为 id_rsa 保存在 .ssh 文件夹中的主目录 (/home/ryan) 中。然后您的公钥将位于 /home/ryan/.ssh/id_rsa.pub <--- 此密钥是您要上传到您的 Assembla 帐户的密钥。

现在您已将 ssh 密钥存储在默认位置,您无需执行任何其他操作即可使用它。

将它上传到您的 Assembla 帐户后,您将能够 git clone:

git clone git@git.assembla.com:repo_name

当您回答“gitrep”时,您正在保存该文件的密钥,在您的当前目录中,我假设主目录(/home/ryan)。

于 2013-07-20T07:21:17.960 回答
1

原始海报状态(强调我的):

然后我收到以下消息。

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 请求时都输入密码。

于 2013-07-20T06:16:58.150 回答