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


244

最近,我一直无法克隆或推送到github,而我正在寻找根本原因。

这是在窗户上

我有cygwin + git以及msysgit。

使用以下选项安装了Msysgit:

  • OpenSSH的
  • 从Windows命令提示符使用Git

这给了我4种尝试在其中使用git的环境:

  • Windows cmd提示
  • 电源外壳
  • 吉特·巴什(Git Bash)
  • 西格温

我设法以某种方式设法使自己在尝试使用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文本http://cdn.cloudfiles.mosso.com/c54102/app7962031255448924.jpg

关于如何真正解决这些权限的任何想法?


1
您可能想告诉我们C:\ Users \ Ben \正在使用什么本机文件系统。文件系统似乎不支持实际的权限,或者外壳和文件系统之间的映射无法正常工作。您可以通过Windows ACL更改权限吗?
陈征费

我使用的是Windows7。我可以更改其权限,但是它们应该是什么?所有的github / ssh文档都说您需要0600,但是我不知道这在Windows ACL中意味着什么。
Ben Scheirman

2
呃...这里有个小注释,但是将目录更改为600是个坏主意。目录(和可执行文件)总是高一个数字(700而不是600,755而不是644)。在目录上执行此操作将使其不公开。有关更多详细说明,请参见dartmouth.edu/~rc/help/faq/permissions.html
Mark Embling,2009年

您反对使用PuTTY吗?
格雷格·培根,2009年

如果它能解决我的问题,那就不行,但是我很好奇为什么这种设置对我不起作用。
本·谢尔曼

Answers:


361

您更改了整个目录的权限,我同意Splash是一个坏主意。如果您记得该目录的原始权限是什么,我将尝试将其设置为该权限,然后执行以下操作

cd ~/.ssh
chmod 700 id_rsa

在.ssh文件夹中。这将仅对所有者(您)将id_rsa文件设置为rwx(读,写,执行),其他所有人的访问权限为零。

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

如果那行不通,我将尝试卸载msysgit,删除计算机上的所有.ssh文件夹(为安全起见),然后使用所需的设置重新安装msysgit并尝试完全重新开始(尽管我认为您告诉过我)您已经尝试过了)。

编辑:也刚刚通过Google找到了此链接- 修复了“警告:未保护的私有密钥文件!”。在Linux上虽然它针对linux,但由于我们正在讨论liunx权限等问题,因此可能会有所帮助。


2
此答案专门适用于使用cygwin或msysgit(因为msysgit使用cygwin或mingw32的子集)。问题是文件的权限。Git喜欢使用(主要是)Linux权限(可能是目标用户的副产品)。已知在Winodws shell中使用git.exe存在问题,我建议您坚持使用msysgit。至少要等到GitSharp正常工作为止。
科比

2
在chmod 700之后,在Windows 8和我安装的cygwin的Jan '14上这不起作用,它将文件显示为rwxrwx--。可以将组权限设置为我设置的用户权限,但不能使用我的密钥。
迪恩·希勒

1
@ DeanHiller,700的许可应如下所示-rwx------。因此,如果正确执行chmod命令,则显示的内容将不正确。
科比2014年

5
@Koby不,这是一个有工作的错误...需要使用chgrp -R Users〜/ .ssh,然后chmod现在可以正常工作,并且实际上正确更改了权限.....一个我最终发现的已知错误另一个帖子。
Dean Hiller 2014年

2
我可以验证Windows的GitBash中是否存在某种错误,其中无法使用chmod设置正确的权限,或者未正确读取权限。chmod 600 id_rsd; ls -l id_rs-> -rwx-r--r--
Charlweed 2014年

74

cygwin的chmod有一个错误,请参考:

/superuser/397288/using-cygwin-in-windows-8-chmod-600-does-not-work-as-expected

chgrp -Rv Users ~/.ssh/* 
chmod -vR 600 ~/.ssh/id_rsa

无论出于何种原因,从Windows权限到类似cygwin / * nix的权限的映射都有些模糊。即使我在Windows端删除了所有其他用户的权限,cygwin仍将我的权限(即用户)应用于另一个名为的None。(我想这是当一组没有被明确定义的标准过程)。这变化到显式的组Users理应允许cygwin的分离的权限,我可以最后组600,而不是自动660
叔集市

3
这是实际的正确答案。被投票为正确答案的人-我认为投票的人是Linux用户,但没有意识到他在正确执行命令。今天我与cygwin有同样的问题。谢谢!
michaelday

在应用此解决方案之前,当我使用chmod 600git时会抱怨我的权限仍然是0660。修复组所有权可使chown正确应用。
Guilherme Rodrigues 2015年

1
我更新了Cygwin,并成功了。他们必须已修复该错误。
邓肯·卡尔弗特

17

对于* nix系统,明显的解决方法是chmod 600 id_rsaofc,但是在Windows 7上,我不得不将头撞在墙上一会儿,但是后来我找到了神奇的解决方案:

转到“我的电脑” /“右键单击” /“属性” /“高级系统设置” /“环境变量”,然后删除该变量(可能来自系统和用户环境):

西格温

基本上,这是git windows二进制文件使用的mingw32中的一个缺陷,总是看到所有文件644和所有文件夹755。删除环境变量不会更改该行为,但显然会告诉ssh.exe忽略该问题。如果您确实通过资源管理器的安全设置为id_rsa设置了适当的权限(实际上,除了您自己,没有“所有人”,“管理员”,“系统”之外,没有其他用户需要。只有您自己) ,您仍然会很安全。

现在,为什么mingw32的,不同的系统的cygwin,将使任何使用Cygwin环境变量的,我是无法理解。对我来说似乎是个虫子。


3
这对我不起作用。我仍然收到“未保护的私有密钥文件”消息。只是想让您知道,以防其他人遇到此线程而产生类似结果。
卢克

为我工作。虽然这是愚蠢的。我什至不再使用Cygwin。另外,您到底是怎么想出来的?
广域网

13

我使用的是XP,这使Git Bash与Github进行了交流(经过无奈之后):

  1. 复制c:\cygwin\bin\cyg*(〜50个文件)到c:\Program Files\Git\bin\
  2. 复制c:\cygwin\bin\ssh.exec:\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:\Program Files\Git\bin\ssh.exe ,因此它不需要创建文件c:\cygwin\bin\ssh.exe。对 ?
爱国者

同意w /“非常沮丧”评论。对于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相同)。基本上,由于没有复制其他依赖项,因此需要从cygwin目录中运行ssh.exe。
迈克尔

尽管它现在对我有用,但接下来的尝试只是将Git和Cygwin都添加到PATH中,并移开Git的ssh.exe,以便使用cygwin的ssh.exe(来自cygwin的bin目录)。
迈克尔

添加LogLevel DEBUG到.ssh \ config文件以从git.exe启动的ssh.exe进程获取调试输出。
knb 2012年

谢谢-这个解决方案对我有用!具体来说,我从c:\ cygwin \ bin \复制了ssh.exe,cygcrypto-0.9.8.dll,cygwin1.dll,cygminires.dll和cygz.dll到C:\ Program Files \ Git \ bin \。
nexus-bytes,

10

对于使用此处找到的Git的Windows 7 (它使用MinGW,而不是Cygwin):

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

1
这是给我的,但是现在我遇到了一个新问题,ssh不喜欢我的密码,我提供密钥文件的任何密码。
杰森·索斯韦尔

7

好的,所以这是我实际上如何在Windows文件上强制更改有关Win7本身的权限的方法:在Windows资源管理器中找到您的ssh密钥:C:\ Users [your_user_name_here] .ssh \ id_rsa

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

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

单击确定并保存直到完成。

我为此战斗了几天,因为我的Windows不会从命令行更改文件权限。这样,它实际上也可以完成-而不是使用令人发指的变通办法。


6

从属性更改文件权限,禁用继承和运行chmod 400对我不起作用。我的私钥文件的权限为:

-r--r ----- 1 alex无1766年3月8日13:04 /home/alex/.ssh/id_rsa

然后我注意到该小组是无,所以我就跑了

chown alex:管理员〜/ .ssh / id_rsa

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


4

对于MAC用户:

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

chmod og-r *filename.pem*

(确保您在正确的目录中,或在命令中正确地找到路径文件名)。




2

我最近在Windows XP上遇到了同样的问题。我试图在我的〜/ .ssh / id_rsa文件中使用chmod 700,但是它似乎没有用。当我在〜/ .ssh / id_rsa上使用ls -l查看权限时,我可以看到我的有效权限仍然是644。

然后我想起了Windows权限也继承了文件夹的权限,并且该文件夹仍然对所有人开放。一种解决方案也可以是设置文件夹的权限,但是我认为更好的方法是告诉系统忽略该文件的继承。可以使用文件属性中“安全性”选项卡上的“高级”选项,然后取消选中“继承自父权限...”来完成此操作。

这可能会对其他有相同问题的人有所帮助。


1

我现在正在使用Git 1.6.5进行游戏,并且无法复制您的设置:

Administrator@WS2008 /k/git
$ ll ~/.ssh
total 8
drwxr-xr-x    2 Administ Administ     4096 Oct 13 22:04 ./
drwxr-xr-x    6 Administ Administ     4096 Oct  6 21:36 ../
-rw-r--r--    1 Administ Administ        0 Oct 13 22:04 c.txt
-rw-r--r--    1 Administ Administ      403 Sep 30 22:36 config_disabled
-rw-r--r--    1 Administ Administ      887 Aug 30 16:33 id_rsa
-rw-r--r--    1 Administ Administ      226 Aug 30 16:34 id_rsa.pub
-rw-r--r--    1 Administ Administ      843 Aug 30 16:32 id_rsa_putty.ppk
-rw-r--r--    1 Administ Administ      294 Aug 30 16:33 id_rsa_putty.pub
-rw-r--r--    1 Administ Administ     1626 Sep 30 22:49 known_hosts

Administrator@WS2008 /k/git
$ git clone git@github.com:alexandrul/gitbook.git
Initialized empty Git repository in k:/git/gitbook/.git/
remote: Counting objects: 1152, done.
remote: Compressing objects: 100% (625/625), done.
remote: Total 1152 (delta 438), reused 1056 (delta 383)s
Receiving objects: 100% (1152/1152), 1.31 MiB | 78 KiB/s, done.
Resolving deltas: 100% (438/438), done.

Administrator@WS2008 /k/git
$ ssh git@github.com
ERROR: Hi alexandrul! You've successfully authenticated, but GitHub does not pro
vide shell access
Connection to github.com closed.

$ ssh -v
OpenSSH_4.6p1, OpenSSL 0.9.8e 23 Feb 2007

chmod也不修改我的密钥的文件权限。

环境:

  • NTFS上的Windows Server 2008 SP2
  • 用户:管理员
  • 环境变量
    • PLINK_PROTOCOL = ssh
    • HOME = / c / profiles / home

更新: Git 1.6.5.1也可以正常工作。


有趣。看起来您正在使用腻子选项?
Ben Scheirman

1

在Windows上,这是一个特别涉及的问题,仅凭此命令正确修改文件是不够的。您必须设置环境。

在Windows上,这对我有用:

  1. 安装cygwin。

  2. 用cygwin的ssh.exe替换msysgit ssh.exe。

  3. 使用cygwin bash,chmod 600私有密钥文件,对我来说是“ id_rsa”。

  4. 如果仍然无法使用,请转到控制面板->系统属性->高级->环境变量,然后添加以下环境变量。然后重复步骤3。

    变量值
    CYGWIN sbmntsec


1

我可以通过做两件事来解决此问题,尽管您可能不必执行步骤1。

  1. 从cygwin ssh.exe和所有cyg * .dll复制到Git的bin目录中(这可能不是必需的,但这是我采取的步骤,但仅此一项无法解决问题)

  2. 请遵循以下步骤: //zylstra.wordpress.com/2008/08/29/overcome-herokus-permission-denied-publickey-problem/

    我在〜/ .ssh / config文件中添加了一些详细信息:

主机heroku.com
主机名heroku.com
端口22
身份仅是
IdentityFile〜/ .ssh / id_heroku
TCPKeepAlive是
用户brandon

我必须使用User作为heroku.com的电子邮件地址。注意:这意味着您需要创建一个密钥,我按照此操作来创建密钥,并且在提示输入密钥名称时,请务必指定id_heroku http:/ /help.github.com/win-set-up-git/

  1. 然后添加密钥:
    heroku keys:添加〜/ .ssh / id_heroku.pub

1

对我来说,窍门是使用以下命令更新CYGWIN环境变量:“ tty nodosfilewarning ”。甚至不需要chmod键。


0

不是主要问题的直接答案,而是关于cygwin文件夹的工作方式的问题...通常,cygwin将所有“您的”文件放在c:\ cygwin \ home \ username的等价之下。它将对该文件夹进行任何用户特定的设置,而不是Windows用户目录。


0

除非您出于某种原因想要保留该私钥/公钥对(id_rsa / id_rsa.pub),或者喜欢在墙上砸头,否则,建议您仅在github上重新创建它们并更新您的公钥。

首先制作〜/ .ssh目录的备份副本。

输入以下内容,然后对是否要覆盖现有文件做出“ y”响应。

ssh-keygen -t rsa

将公共密钥的内容复制到剪贴板。(以下是在Mac上的操作方法)。

cat ~/.ssh/id_rsa.pub | pbcopy

转到您在github上的帐户并添加此密钥。

Name: My new public key
Key: <PASTE>

从终端退出,然后重新启动一个新终端。

如果您从未输入密码时收到诸如“输入密码”之类的毫无意义的错误消息,请考虑这种重新开始技术。如上所见,它并不复杂。


0

我从未设法让git在Powershell中完全工作。但是在git bash shell中,我没有任何与权限相关的问题,并且不需要设置chmod等...将ssh添加到Github之后,我就可以启动并运行了。



0

您是否从另一台计算机复制了密钥文件?

我只是在id_rsa客户端计算机上创建了一个文件,然后将密钥粘贴到了我想要的文件中。没有权限问题。没什么可设置的。它只是工作。如果您使用PuTTYgen创建私钥,它也可以使用。

如果要从另一台计算机复制它,则可能是一些隐藏的组问题。

在两台Windows 8.1计算机上进行了测试。使用Sublime Text 3复制并粘贴私钥。使用Git Bash(Git-1.9.4-preview20140611)。


0

在将我的Cygwin安装升级到2015年2月(1.7.34(0.285/5/3) 2015-02-04 12:14 x86_64 Cygwin)左右的版本后,我突然遇到了UNPROTECTED PRIVATE KEY FILE警告。

我运行以下命令后解决了此问题:

setfacl -s u::rw-,g::---,o:--- ~/.ssh/id_rsa

另一个问题的另一个答案给出了更多的上下文)


0

@koby的答案对我不起作用,因此我进行了一些更改。

cd ~/.ssh
chmod 700 id_rsa.pub

在Mac上,这对我来说效果很好。


0

我在Windows 10上尝试通过SSH进入Vagrant框时遇到了相同的问题。这似乎是旧版OpenSSH中的错误。对我有用的是:

  1. 从安装最新的OpenSSH http://www.mls-software.com/opensshd.html
  2. SSH文件

(如果使用的是Powershell,请注意“ .exe”)

您可能会看到类似以下内容:

C:\Windows\System32\OpenSSH\ssh.exe
C:\Program Files\OpenSSH\bin\ssh.exe
C:\opscode\chefdk\embedded\git\usr\bin\ssh.exe

请注意,在上面的示例中,最新的OpenSSH在路径中排第二,因此不会执行。

更改顺序:

  1. 右键单击Windows按钮->设置->“编辑系统环境变量”
  2. 在“高级”选项卡上,单击“环境变量...”
  3. 在系统变量下,编辑“路径”。
  4. 选择“ C:\ Program Files \ OpenSSH \ bin”和“向上移动”,使其显示在顶部。
  5. 点击确定
  6. 重新启动控制台,以便可以应用新的环境变量。

0

我的系统与bash / cygwin / git / msysgit /也许还有些混乱...

chmod对密钥或config文件没有影响。

然后,我决定从有效的Windows中使用它。

  1. 右键单击需要修复权限的文件。
  2. 选择Properties
  3. 选择Security标签。
  4. 单击Advanced底部附近。
  5. 点击Change旁边的Owner顶部附近。
  6. 键入“我-真棒-用户名”(显然它修改成当前的Windows用户名),并单击Check Names,然后OK
  7. 在下Permission entries:,突出显示不是“ My-Awesome-Username”的每个用户,然后选择Remove。重复此操作,直到仅剩“ My-Awesome-Username”。
  8. 选择“我的用户名”,然后单击Edit下面。
  9. 确保Type:顶部的设置为Allow,然后勾选旁边的复选框Full control
  10. OKApplyOKOK

  11. 现在再试一次...

似乎有时候,bash-bash无法控制文件所有权。它是特别奇怪的,因为它是由模仿bash脚本生成的。去搞清楚。


0

此处建议的解决方法(chmod / chgrp / setfacl / windows perms)均不适用于Windows 7企业VM上的msys64。最后,我通过使用带有stdin上提供的密钥的ssh代理来解决该问题。将其添加到我的.bash_profile帐户中成为我的默认登录名:

eval $(ssh-agent -s)
cat ~/.ssh/id_rsa | ssh-add -k -

现在我可以使用ssh遥控器进行git push和pull了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.