SSH私钥权限在使用Git GUI或ssh-keygen时过于开放。

256

最近我无法在GitHub上进行克隆或推送操作,正在努力寻找根本原因。

这是在Windows上。

我安装了cygwin + git和msysgit。

Msysgit是使用以下选项安装的:

  • OpenSSH
  • 在Windows命令提示符中使用Git

这为我提供了4个环境来尝试使用Git:

  • Windows命令提示符
  • Powershell
  • Git Bash
  • Cygwin

不知何故,我现在无法使用msysgit、cmd.exe或Powershell克隆存储库,会收到以下错误:

> Initialized empty Git repository in
> C:/sandbox/SomeProject/.git/
> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
> @    WARNING: UNPROTECTED PRIVATE KEY FILE!          @
> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
> Permissions 0644 for
> '/c/Users/Ben/.ssh/id_rsa' are too
> open. It is recommended that your
> private key files are NOT accessible
> by others. This private key will be
> ignored. bad permissions: ignore key:
> /c/Users/Ben/.ssh/id_rsa Permission
> denied (publickey). fatal: The remote
> end hung up unexpectedly

这里使用的是位于c:\users\ben\文件夹中的 .ssh 文件夹,这也是 msysgit 使用的。我猜测 cygwin 能够工作是因为 .ssh 文件夹位于别处,但我不确定原因

在 Git Bash 中,我检查权限:

$ ls -l -a ~/.ssh

这给了我:

drwxr-xr-x    2 Ben      Administ        0 Oct 12 13:09 .    
drwxr-xr-x   34 Ben      Administ     8192 Oct 12 13:15 ..    
-rw-r--r--    1 Ben      Administ     1743 Oct 12 12:36 id_rsa
-rw-r--r--    1 Ben      Administ      399 Oct 12 12:36 id_rsa.pub    
-rw-r--r--    1 Ben      Administ      407 Oct 12 13:09 known_hosts

这些权限显然过于宽松。它们为何变成这个样子,我不知道。

我可以尝试更改它们...

$ chmod -v -R 600 ~/.ssh

这告诉我:

mode of `.ssh' changed to 0600 (rw-------)
mode of `.ssh/id_rsa' changed to 0600 (rw-------)
mode of `.ssh/id_rsa.pub' changed to 0600 (rw-------)
mode of `.ssh/known_hosts' changed to 0600 (rw-------)

但它似乎没有效果。我仍然收到相同的错误,并且执行

$ ls -l -a ~/.ssh

仍然具有与之前相同的权限。

更新:

我尝试在cygwin中修复这些文件的权限,cygwin正确地报告了它们的权限,但gitbash没有:alt text http://cdn.cloudfiles.mosso.com/c54102/app7962031255448924.jpg

有什么想法可以真正解决这些权限问题吗?


1
你可能需要告诉我们C:\Users\Ben\使用的是什么本地文件系统。看起来该文件系统不支持真正的权限,或者外壳和文件系统之间的映射没有正常工作。您能否通过Windows ACL更改权限? - Chen Levy
我正在使用Windows 7。我可以更改权限,但它们应该是什么?所有的github/ssh文档都说你需要0600,但我不知道在Windows ACLs中意味着什么。 - Ben Scheirman
2
嗯...这里有一个小提示,但是将目录的chmod设置为600是个坏主意。目录(和可执行文件)总是比文件多一位数字(700而不是600,755而不是644)。在目录上这样做会使其无法列出。请参阅http://www.dartmouth.edu/~rc/help/faq/permissions.html以获取更详细的解释。 - Mark Embling
我需要这个适用于Windows 7。 在Windows 7上,chmod命令似乎无法正常工作。 - Q Boiler
我也遇到了同样的奇怪错误,什么都试过了,但是还是不行。我打算放弃在Windows上部署Rails的舒适环境。 - Gediminas Šukys
显示剩余2条评论
25个回答

380

你更改了整个目录的权限,我同意Splash的观点,这是一个糟糕的想法。如果你还记得该目录的原始权限,我建议您将其设置回去,然后执行以下操作:

cd ~/.ssh
chmod 700 id_rsa

在 .ssh 文件夹内,设置 id_rsa 文件仅对所有者(你)具有 rwx(读取、写入、执行)权限,而其他人则没有任何访问权限。

如果您不记得原始设置是什么,请添加一个新用户并为该用户创建一组 SSH 密钥,从而创建一个新的 .ssh 文件夹,该文件夹将具有默认权限。您可以使用该新 .ssh 文件夹作为重置您的 .ssh 文件夹和文件权限的参考。

如果这无法解决问题,我建议尝试卸载 msysgit,并删除计算机上的所有 .ssh 文件夹(为了安全起见),然后使用所需的设置重新安装 msysgit 并完全重新开始(尽管我认为您已经尝试过这个方法)。

编辑:还通过 Google 找到了此链接 - Fixing "WARNING: UNPROTECTED PRIVATE KEY FILE!" on Linux 虽然它是针对 Linux 的,但由于我们正在讨论 liunx 权限等问题,因此可能会有所帮助。


2
这个答案特别适用于使用cygwin或msysgit(因为msysgit使用cygwin的子集或可能是mingw32)。问题在于文件的权限。Git喜欢使用(大多数)Linux权限(可能是其目标受众的副产品)。已知在Windows shell中使用git.exe存在问题,我建议坚持使用msysgit。至少在GitSharp完全工作之前。 - Koby
2
这在Windows 8和我2014年一月安装的Cygwin上无法运行,即使使用chmod 700命令,文件权限仍显示为rwxrwx---。群组权限需要设置为与用户权限相同,但是我无法使用我的密钥。 - Dean Hiller
1
@DeanHiller,权限为700应该显示为“-rwx------”。如果您已正确执行chmod命令,则您所显示的内容是不正确的。 - Koby
5
不,那是一个有解决方式的错误……需要使用“chgrp -R Users ~/.ssh”,然后“chmod”现在可以工作并且正确地更改权限了。我最终在另一篇帖子中找到了这个已知的错误。 - Dean Hiller
2
我可以验证,在GitBash for Windows中存在某种错误,无法使用chmod设置正确的权限,或者权限无法正确读取。 chmod 600 id_rsd; ls -l id_rs -> -rwx-r--r-- - Charlweed
显示剩余2条评论

76

由于某种原因,从Windows权限到cygwin/*nix-like权限的映射有点模糊。即使我在Windows端删除了所有其他用户的权限,cygwin仍然将权限应用于另一个名为“None”的,而不是我这个用户。(我想当一个组没有被明确定义时,这是标准程序)。据说将此更改为显式组“Users”可以使cygwin分离权限,最终我可以设置600而不是自动660。 - t-mart
3
这是确切正确的答案。被选为正确答案的那个 - 我认为投票支持它的人是Linux用户,没有意识到他正确地执行了命令。我今天在Cygwin上也遇到了同样的问题。谢谢! - michaelday
在应用此解决方案之前,当我使用 chmod 600 时,git 会抱怨我的权限仍然是 0660。修复组所有权使 chown 正确应用。 - Guilherme Rodrigues
1
我更新了Cygwin,它可以工作了。他们一定修复了这个漏洞。 - Duncan Calvert

19

对于*nix系统,显然的解决方法是chmod 600 id_rsa。但在Windows 7上,我不得不在墙上撞了一段时间,然后我找到了魔法解决方案:

进入“我的电脑”/右键单击/属性/高级系统设置/环境变量,然后删除该变量(可能需要从系统和用户环境中删除):

CYGWIN

基本上,这是由Git Windows二进制文件使用的mingw32的缺陷,它总是看到所有文件为644,所有文件夹为755。删除环境变量并不会改变这种行为,但显然它告诉ssh.exe忽略了这个问题。如果您通过资源管理器的安全设置设置正确的id_rsa权限(除了您自己之外,没有其他用户需要在那里,不是“每个人”,不是“管理员”,也不是“系统”。没有。只有你),你仍然是安全的。

现在,为什么mingw32,一个不同于cygwin的系统,会使用CYGWIN环境变量,这超出了我的理解范围。看起来像是一个错误。


3
对我不起作用,我仍然收到“未受保护的私钥文件”消息。只是想让你知道,以防其他人遇到类似的结果。 - Luc
对我来说有效。但这太荒谬了。我甚至不再使用Cygwin了。另外,你是怎么想到这个方法的? - mostlydev

13

我在XP系统上,通过以下步骤使Git Bash能够与Github通信(经过了很多挫折):

  1. c:\cygwin\bin\cyg*(大约50个文件)复制到 c:\Program Files\Git\bin\
  2. c:\cygwin\bin\ssh.exe 复制到 c:\Program Files\Git\bin\(覆盖原有文件)
  3. 创建文件 c:\Documents and Settings\<username>\.ssh\config ,并加入以下内容:

    Host github.com
        User git
        Hostname github.com
        PreferredAuthentications publickey
        IdentityFile "/cygdrive/c/Documents and Settings/<username>/.ssh/id_rsa"
    
  4. (可选) 使用ssh -v git@github查看连接调试信息。

  5. 尝试进行推送操作!

背景:这个一般性的问题是以下两个问题的结合:

  • BUG:mingw32将所有文件视为644(其他/组可读),我在mingw32、cygwin或Windows中尝试的任何方法都无法解决。
  • mingw32的SSH版本不允许使用私钥(通常在服务器上是一个好的策略)。

看起来不需要创建一个文件 c:\Documents and Settings\<username>\.ssh\config,因为你已经用 c:\cygwin\bin\ssh.exe 替换了 c:\Program Files\Git\bin\ssh.exe。对吧? - 爱国者
同意“非常沮丧”的评论。对于gitolite,我按照以下步骤操作,将cygwin/bin/cyg*复制到我的Git目录(PortableGit或Program Files/Git),然后发现我可以在Git-Bash中使用git,但不能在cygwin bash中使用。将PortableGit和Cygwin bin目录都添加到我的PATH中也有一定的成功...但是我仍然不得不移动PortableGit/bin/ssh.exe{,.bak},以防止它被意外使用(即使它与c:/cygwin/bin/ssh.exe相同)。基本上由于未复制其他依赖项,ssh.exe需要从cygwin目录运行。 - michael
虽然现在它对我来说是有效的,但下一步尝试的方法将是将Git和Cygwin都添加到PATH中,并将Git的ssh.exe移出路径,以便使用cygwin的ssh.exe(从cygwin的bin目录)。 - michael
在 .ssh\config 文件中添加 LogLevel DEBUG ,以获取由 git.exe 启动的 ssh.exe 进程的调试输出。 - knb
谢谢 - 这个解决方案对我有用!具体来说,我从c:\cygwin\bin\复制了ssh.exe、cygcrypto-0.9.8.dll、cygwin1.dll、cygminires.dll和cygz.dll到C:\Program Files\Git\bin\。 - nexus-bytes

10

对于使用MinGW而非Cygwin的Git在Windows 7上的情况,可在此处找到:

  1. 在Windows资源管理器中,右键单击id_rsa文件并选择“属性”
  2. 选择“安全”选项卡,然后点击“编辑…”
  3. 勾选除管理员以外的所有组的“完全控制”旁边的“拒绝”框
  4. 重试您的Git命令

1
这对我来说就是这样了,但现在我有一个新问题,ssh不喜欢我的密码,无论我给我的密钥文件什么密码。 - Jason Southwell

7

好的,这是我在Windows 7上关于权限方面如何强制更改文件本身权限的实际操作方式:

在Windows资源管理器中找到您的ssh密钥: C:\Users\[您的用户名].ssh\id_rsa

右键单击文件 > 属性 > 安全选项卡 > 高级按钮 > 更改权限

现在删除不属于您用户名的所有人,包括管理员和系统用户。此时可能会出现关于继承权限的对话框 - 选择不继承的选项,因为我们只想更改此文件。

点击“确定”并保存,直到完成。

我花了几天时间去解决这个问题,因为我的Windows无法通过命令行更改文件权限。这种方式也确实做到了-而不是使用奇怪后果的解决方法。


6

通过属性更改文件权限,禁用继承并运行 chmod 400 对我没有用。 我的私钥文件权限为:

-r--r----- 1 alex None 1766 Mar 8 13:04 /home/alex/.ssh/id_rsa

然后我注意到组是None,所以我只需运行

chown alex:Administrators ~/.ssh/id_rsa

然后我就可以成功地使用 chmod 400 更改权限并运行 git push。


3

对于Mac用户:

通过在终端中输入以下内容来更改密钥对文件的设置:

chmod og-r *filename.pem*

确保您在正确的目录中,或在命令中正确输入路径和文件名。

2

我是这样解决的:

chmod 400 ~/.ssh/id_rsa

我希望能为您提供帮助。祝您好运。


1
将权限更改为400,正如Cristian所提到的那样,这将更加安全。 - Sylvester Loreto

2
我最近在Windows XP上遇到了同样的问题。我尝试对我的~/.ssh/id_rsa文件运行chmod 700命令,但好像没有生效。当我使用ls -l命令查看~/.ssh/id_rsa文件的权限时,发现我的有效权限仍然是644。
后来我想起来,Windows权限也会继承文件夹的权限,而这个文件夹仍然对所有人开放。解决方案可以是为文件夹设置权限,但我认为更好的方法是告诉系统忽略此文件的继承权限。这可以通过文件属性中安全选项卡上的高级选项完成,并取消“从父对象继承权限”的勾选。
这可能对其他遇到同样问题的人有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接