【问题标题】:SSH Private Key Permissions using Git GUI or ssh-keygen are too open使用 Git GUI 或 ssh-keygen 的 SSH 私钥权限太开放
【发布时间】:2010-12-06 01:56:55
【问题描述】:

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

这是在 Windows 上

我有 cygwin + git 和 msysgit。

Msysgit 使用以下选项安装:

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

这给了我 4 个环境来尝试使用 git:

  • Windows cmd 提示符
  • Powershell
  • Git 重击
  • 赛格温

不知何故,当我尝试使用 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

关于如何真正修复这些权限的任何想法?

【问题讨论】:

  • 您可能想告诉我们 C:\Users\Ben\ 使用的本机文件系统是什么。似乎该文件系统不支持真正的权限,或者外壳和文件系统之间的映射无法正常工作。您可以通过 Windows ACL 更改权限吗?
  • 我使用的是 Windows 7。我可以更改权限,但它们应该是什么?所有 github/ssh 文档都说您需要 0600,但我不知道这在 Windows ACL 中意味着什么。
  • 呃......这里有点旁注,但是将目录更改为 600 是个坏主意。目录(和可执行文件)总是高一位(700 不是 600,755 不是 644)。在目录上执行此操作将使其无法列出。更详细的解释见dartmouth.edu/~rc/help/faq/permissions.html
  • 你反对使用 PuTTY 吗?
  • 如果它解决了我的问题,那么不会,但我很想知道为什么这个设置对我不起作用。

标签: git ssh cygwin msysgit openssh


【解决方案1】:

您更改了整个目录的权限,我同意 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 权限等。

【讨论】:

  • 这个答案特别适用于使用 cygwin 或 msysgit(因为 msysgit 使用 cygwin 或可能是 mingw32 的子集)。问题是文件的权限。 Git 喜欢使用(大部分)Linux 权限(可能是它的目标受众的副产品)。众所周知,在 Winodws shell 中使用 git.exe 会出现问题,我建议坚持使用 msysgit。至少在 GitSharp 完全正常工作之前。
  • 这在 Windows 8 和我 14 年 1 月安装的 cygwin 上不起作用,因为在 chmod 700 之后,它显示文件为 rwxrwx---。将组权限设置为我设置用户权限的任何内容,并且我无法使用我的密钥。
  • @DeanHiller,700 的权限应该类似于-rwx------。因此,如果您正确执行了 chmod 命令,则显示的内容不正确。
  • @Koby 不,这是一个工作中的错误......需要使用 chgrp -R Users ~/.ssh 然后 chmod 现在正在工作并且实际上正确更改了权限...... .一个我终于在另一篇文章中发现的已知错误。
  • 我可以验证 GitBash for Windows 中是否存在某种错误,无法使用 chmod 设置正确的权限,或者未正确读取权限。 chmod 600 id_rsd; ls -l id_rs -> -rwx-r--r--
【解决方案2】:

cygwin的chmod有一个bug,请参考:

https://superuser.com/questions/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-like 权限的映射有点模糊。即使我在 Windows 端删除了所有其他用户的权限,cygwin 仍然为我,user 将权限应用到另一个名为 Nonegroup。 (我想这是未显式定义组时的标准过程)。对显式组 Users 的更改据说允许 cygwin 分离权限,我最终可以设置 600 而不是自动 660。
  • 这是实际的正确答案。被选为正确答案的那个 - 我认为投票的人是 linux 用户并且没有意识到他正在正确执行命令。我今天在 cygwin 上遇到了同样的问题。谢谢!
  • 在应用这个解决方案之前,当我使用chmod 600 时,git 会抱怨我的权限仍然是0660。修复组所有权使 chown 正确应用。
  • 我更新了 Cygwin 并且成功了。他们一定已经修复了这个错误。
【解决方案3】:

对于 *nix 系统,显而易见的解决方法是 chmod 600 id_rsa ofc,但在 windows 7 上我不得不用头撞墙一段时间,但后来我找到了神奇的解决方案:

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

CYGWIN

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

现在,为什么 mingw32(与 cygwin 不同的系统)会任何使用 CYGWIN 环境变量,这让我无法理解。对我来说似乎是一个错误。

【讨论】:

  • 这对我不起作用。我仍然收到“未受保护的私钥文件”消息。只是想让您知道,以防其他人发现此线程并获得类似结果。
  • 为我工作。不过,这很愚蠢。我什至不再使用 Cygwin。另外,你到底是怎么想出来的?
【解决方案4】:

我在 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\&lt;username&gt;\.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 目录运行,因为其他依赖项没有被复制过来。
  • 虽然它现在对我有用,但接下来尝试将 Git 和 Cygwin 添加到 PATH 中,并将 Git 的 ssh.exe 移开以便使用 cygwin 的 ssh.exe (来自 cygwin 的 bin 目录)。
  • 在 .ssh\config 文件中添加LogLevel DEBUG 以获取 git.exe 启动的 ssh.exe 进程的调试输出。
  • 谢谢 - 这个解决方案对我有用!具体来说,我从 c:\cygwin\bin\ 复制了 ssh.exe、cygcrypto-0.9.8.dll、cygwin1.dll、cygminires.dll 和 cygz.dll 到 C:\Program Files\Git\bin\。跨度>
【解决方案5】:

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

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

【讨论】:

  • 这是给我的,但现在我有一个新问题,ssh 不喜欢我的密码,我给我的密钥文件的任何密码。
【解决方案6】:

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

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

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

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

我为此奋斗了好几天,因为我的 Windows 不会从命令行更改文件权限。通过这种方式,它实际上也完成了——而不是使用令人兴奋的变通方法,这可能会产生奇怪的后果。

【讨论】:

    【解决方案7】:

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

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

    然后我注意到该组没有,所以我就跑了

    chown alex:Administrators ~/.ssh/id_rsa

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

    【讨论】:

      【解决方案8】:

      对于 MAC 用户:

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

      chmod og-r *filename.pem*
      

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

      【讨论】:

        【解决方案9】:

        在最近遇到这个问题并且这是谷歌的顶级结果之一之后,我想我会在这里讨论中记录的一个简单的工作:http://code.google.com/p/msysgit/issues/detail?id=261#c40

        只需用你的 cygwin ssh.exe 覆盖 mysys ssh.exe

        【讨论】:

          【解决方案10】:

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

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

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

          【讨论】:

            【解决方案11】:

            我解决它运行:

            chmod 400 ~/.ssh/id_rsa
            

            希望能帮到你。祝你好运。

            【讨论】:

            • 如 Cristian 所说,将权限更改为 400 会更安全。
            【解决方案12】:

            我正在使用 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 也能正常工作。

            【讨论】:

            • 有趣。看起来您正在使用 putty 选项?
            【解决方案13】:

            这在 Windows 上是一个特别复杂的问题,仅仅正确地对文件进行 chmod 是不够的。你必须设置你的环境。

            在 Windows 上,这对我有用:

            1. 安装 cygwin。

            2. 将 msysgit ssh.exe 替换为 cygwin 的 ssh.exe。

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

            4. 如果还是不行,进入控制面板->系统属性->高级->环境变量,添加如下环境变量。然后重复第 3 步。

              变量    值
              CYGWIN     sbmntsec

            【讨论】:

              【解决方案14】:

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

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

              2. 按照以下步骤操作:http://zylstra.wordpress.com/2008/08/29/overcome-herokus-permission-denied-publickey-problem/

                我在 ~/.ssh/config 文件中添加了一些细节:

              托管 heroku.com
              主机名 heroku.com
              端口 22
              身份只有是的
              身份文件 ~/.ssh/id_heroku
              TCPKeepAlive 是
              用户布兰登

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

              1. 然后添加密钥:
                heroku 键:添加 ~/.ssh/id_heroku.pub

              【讨论】:

                【解决方案15】:

                对我来说,诀窍是将 CYGWIN 环境变量更新为:“tty nodosfilewarning”。甚至不需要 chmod 密钥。

                【讨论】:

                  【解决方案16】:

                  不是对主要问题的直接回答,而是关于 cygwin 文件夹如何工作的问题... 作为一般规则,cygwin 将所有“您的”文件放在 c:\cygwin\home\username 的等效项下。它会针对任何特定于用户的设置处理该文件夹,而不是 Windows 用户目录。

                  【讨论】:

                    【解决方案17】:

                    除非您出于某种原因想要保留该私钥/公钥对 (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>
                    

                    从您的终端退出并重新启动一个新终端。

                    如果您在从未输入过公钥的情况下收到诸如“输入您的密码”之类的无意义的错误消息,请考虑这种重新开始技术。正如你在上面看到的,它并不复杂。

                    【讨论】:

                      【解决方案18】:

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

                      【讨论】:

                        【解决方案19】:

                        在终端输入:

                        chmod -Rf 700 ~/.ssh/
                        

                        然后再试一次。

                        【讨论】:

                          【解决方案20】:

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

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

                          如果你从另一台机器上复制它,可能是一些隐藏的组问题。

                          在两台 Windows 8.1 机器上测试。使用 Sublime Text 3 复制和粘贴私钥。使用 Git Bash (Git-1.9.4-preview20140611)。

                          【讨论】:

                            【解决方案21】:

                            在将我的 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
                            

                            another answer 到另一个问题提供更多上下文)

                            【讨论】:

                              【解决方案22】:

                              @koby 的回答对我不起作用,所以我做了一点改变。

                              cd ~/.ssh
                              chmod 700 id_rsa.pub
                              

                              这对我在 Mac 上很有效。

                              【讨论】:

                                【解决方案23】:

                                我在 Windows 10 上遇到了同样的问题,我尝试通过 SSH 连接到 Vagrant 盒子。这似乎是旧 OpenSSH 版本中的一个错误。什么对我有用:

                                1. http://www.mls-software.com/opensshd.html 安装最新的 OpenSSH
                                2. where.exe 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. 重新启动您的控制台,以便应用新的环境变量。

                                【讨论】:

                                  【解决方案24】:

                                  我的系统有点乱 bash/cygwin/git/msysgit/maybe-more...

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

                                  然后我决定从 Windows 中处理它,这很有效。

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

                                  11. 现在再试一次...

                                  似乎有时 mock-bash 无法控制文件所有权。这特别奇怪,因为它是从模拟 bash 脚本生成的。去图吧。

                                  【讨论】:

                                    【解决方案25】:

                                    此处建议的解决方法 (chmod/chgrp/setfacl/windows perms) 对我在 Windows 7 企业 VM 上的 msys64 均无效。最后,我通过使用带有标准输入上提供的密钥的 ssh 代理解决了这个问题。将此添加到我的.bash_profile 使其成为我登录的默认设置:

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

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

                                    【讨论】:

                                      猜你喜欢
                                      • 2016-09-15
                                      • 2012-03-05
                                      • 2019-05-02
                                      • 2012-07-29
                                      • 2013-11-27
                                      • 2015-07-08
                                      • 2021-09-10
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多