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个回答

2

最近遇到了这个问题,同时也发现这是谷歌搜索结果中排名较高的一个,我想用一种简单的解决方法来帮忙。在这里有详细地讨论: http://code.google.com/p/msysgit/issues/detail?id=261#c40

方法很简单,只需要用cygwin的ssh.exe覆盖msys ssh.exe即可。


1
@koby的答案对我无效,因此我做了一点更改。
cd ~/.ssh
chmod 700 id_rsa.pub

这在我的Mac上很好用。


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 同样可行。


有趣。看起来你正在使用putty选项? - Ben Scheirman

1
更新CYGWIN环境变量为"tty nodosfilewarning"对我很有帮助。甚至不需要chmod密钥。

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
仅限身份验证 yes
身份验证文件 ~/.ssh/id_heroku
TCPKeepAlive yes
用户 brandon

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

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

1

这是一个在Windows上特别复杂的问题,仅仅正确地更改文件权限是不够的。你需要设置好你的环境。

在Windows上,我采用了以下方法:

  1. 安装cygwin。

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

  3. 使用cygwin bash,对私钥文件进行chmod 600操作,我的私钥文件名为"id_rsa"。

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

    变量      值
    CYGWIN      sbmntsec


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
在终端上键入以下内容:
chmod -Rf 700 ~/.ssh/

请再试一次。


0

我在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. 在系统变量下编辑 "Path"。
  4. 选择 "C:\Program Files\OpenSSH\bin" 并向上移动,使其出现在顶部。
  5. 点击确定
  6. 重新启动控制台,以便新的环境变量生效。

0

我的系统有点乱,装了bash/cygwin/git/msysgit/可能还有其他的...

chmod 对密钥或者config文件没有产生任何效果。

后来我决定从Windows的角度来解决问题,这样行得通。

右键单击需要修复权限的文件。 选择“属性”。 选择“安全”选项卡。 在底部附近单击“高级”。 在顶部附近“所有者”旁边单击“更改”。 输入“我的用户名”(显然将其更改为当前Windows用户名),然后单击“检查名称”,然后单击“确定”。 在“权限条目:”下,突出显示除“我的用户名”之外的每个用户,并选择“删除”。重复此操作,直到只有“我的用户名”为止。 选择“My-Awesome-Username”,然后在下面单击“编辑”。 确保顶部的“类型:”设置为“允许”,然后勾选“完全控制”旁边的复选框。 点击“确定”,“应用”,“确定”,“确定”。 现在再试一次...

看起来有时候 mock-bash 无法控制文件所有权。这特别奇怪,因为它是从一个 mock-bash 脚本生成的。


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