使用Git GUI或SSH -keygen的SSH私钥权限太开放

最近我一直无法克隆或推送到github,我试图找到根本原因。

这是在窗口上

我有cygwin + git以及msysgit。

安装Msysgit的选项如下:

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

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

  • Windows cmd提示符
  • 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文本http://cdn.cloudfiles.mosso.com/c54102/app7962031255448924.jpg < / p >

关于如何真正修复这些权限,有什么想法吗?

279903 次浏览

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

cd ~/.ssh
chmod 700 id_rsa

在.ssh文件夹中。这将只对所有者(您)将id_rsa文件设置为rwx(读、写、执行),而对其他所有人都没有访问权。

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

如果这不起作用,我会尝试卸载msysgit,删除计算机上的所有.ssh文件夹(只是为了安全起见),然后重新安装msysgit,并尝试完全重新开始(尽管我认为你告诉我你已经尝试过了)。

编辑:也刚刚发现这个链接通过谷歌——修复Linux上的“警告:未保护的私钥文件!虽然它是针对linux,它可能会有帮助,因为我们正在谈论linux权限等。

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

我现在正在使用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
  • 用户:管理员
  • <李>环境var:
    • PLINK_PROTOCOL = ssh
    • = / c / profiles /家
    • 李< / ul > < / >

    更新: Git 1.6.5.1也可以。

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

然后我想起来了,windows权限也继承了文件夹的权限,而且这个文件夹仍然对所有人开放。一种解决方案可能是为文件夹设置权限,但我认为更好的方法是告诉系统忽略该文件的继承。这可以使用文件属性中的security选项卡上的高级选项来完成,并取消选中“inherit from parent permissions…”

这可能对其他有同样问题的人有帮助。

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

简单地涉及覆盖mysys ssh.exe与你的cygwin ssh.exe

我在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. (optional) Use ssh -v git@github to see the connection debugged.

  5. Try a push!

Background: The general problem is a combination of these two:

  • BUG: mingw32 sees all files as 644 (other/group-readable), and nothing I tried in mingw32, cygwin, or Windows could fix it.
  • mingw32's SSH version won't allow that for private keys (generally a good policy in a server).

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

在Windows上,这对我来说很管用:

  1. 安装cygwin。

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

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

  4. 如果仍然无效,进入“控制面板->系统属性->高级->环境变量”,添加如下环境变量。然后重复步骤3。

    变量,,,价值 < br > CYGWIN,,李,sbmntsec < / p > < / >

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

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

我可以通过做两件事来解决这个问题,尽管你可能不需要做第一步。

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

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

    我添加了一些细节到我的~/。ssh / config文件:< / p >

< p >主机heroku.com < br > 主机名:heroku.com < br > 端口22 < br > IdentitiesOnly是的< br > IdentityFile ~ / . ssh / id_heroku < br > TCPKeepAlive是的< br > 用户brandon

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

  1. 然后添加键:
    Heroku键:add ~/.ssh/id_heroku.pub

MAC用户:

在终端中输入以下命令更改密钥对文件的设置:

chmod og-r *filename.pem*

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

对于*nix系统,明显的修复是chmod 600 id_rsa ofc,但在windows 7上,我不得不把头撞到墙上一段时间,但后来我发现了神奇的解决方案:

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

CYGWIN

基本上,这是git windows二进制使用的mingw32中的一个缺陷,总是看到所有文件644和所有文件夹755。删除环境变量并不会改变这种行为,但它显然会告诉ssh.exe忽略这个问题。如果你确实通过探索者的安全设置对你的id_rsa设置了适当的权限(除了你自己的用户之外,真的不需要有任何其他用户,不是“everyone”,不是“administrators”,不是“system”。一个也没有。只有你),你仍然是安全的。

现在,为什么mingw32(与cygwin不同的系统)会让<强> < / >强使用cygwin环境变量,这超出了我的理解。我看像只虫子。

对我来说,有用的技巧是用:"< em > tty nodosfilewarning < / em >"更新CYGWIN环境变量。甚至不需要修改密钥。

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

< a href = " https://superuser.com/questions/397288/using——cygwin - windows - 8 chmod - 600——不是——工作————预期”> https://superuser.com/questions/397288/using - cygwin -在- windows - 8 chmod - 600 -——不——工作——预期< / >

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

好,这就是我如何在Win7上强制更改我的Windows文件的权限本身: 在windows资源管理器中找到ssh密钥: C: \ [your_user_name_here] . ssh用户\ id_rsa < / p >

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

现在删除所有不是你用户名的用户。这包括管理员和系统用户。在这一点上,你可能会看到一个关于继承权限的对话-选择DOESN'T inherit选项-因为我们只想更改这个文件。

单击OK并保存直到完成。

我为此斗争了好几天,因为我的窗口不会从命令行更改文件权限。这样做也是真实的——而不是使用令人兴奋的工作,使可能产生奇怪的后果。

除非你有理由想要保留私钥/公钥对(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>

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

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

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

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

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

然后我注意到这个小组没有人,所以我就跑了

chown alex:Administrators ~/.ssh/id_rsa

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

终端类型:

chmod -Rf 700 ~/.ssh/

再试一次。

你从另一台机器复制了密钥文件吗?

我只是在客户端机器上创建了一个id_rsa文件,然后将我想要的密钥粘贴进去。没有权限问题。没有东西可以凝固。它就是管用。如果使用PuTTYgen创建私钥,它也可以工作。

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

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

我通过运行来解决它:

chmod 400 ~/.ssh/id_rsa

我希望能有所帮助。祝你好运。

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

(另一个答案到另一个问题提供了更多的上下文)

@科比的答案不适合我,所以我做了一点改变。

cd ~/.ssh
chmod 700 id_rsa.pub

这在我的Mac上运行得很好。

我在Windows 10上也遇到了同样的问题,我试图SSH进入一个Vagrant盒子。这似乎是旧OpenSSH版本中的一个bug。对我有用的是:

  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. 单击OK
  6. 重新启动控制台,以便应用新的环境变量。

我的系统有点混乱的bash/cygwin/git/msysgit/也许-更多…

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脚本生成的。图。

这里建议的解决方案(chmod/chgrp/setfacl/windows perms)都不适合我在windows 7企业虚拟机上使用msys64。最后,我通过使用带有stdin上提供的键的ssh代理解决了这个问题。将这个添加到我的.bash_profile使它成为我登录的默认值:

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

现在我可以用ssh遥控器进行git推拉操作了。