我刚刚安装适用于 Windows 的 Git 2.30.1并使用 生成 ssh 密钥。我的私钥具有权限 644,我无法使用 chmod 更改它。运行时, 此文件的权限没有任何错误或影响。ssh-keygen -t ed25519 -C "[email protected]"
chmod 600 id_ed25519
我知道 Windows 及其文件系统不支持类似 unix 的权限,但我需要设置它们才能被另一方(bitbucket 实例)接受。还有人有这个问题吗?
为什么我认为权限是问题所在?
我可以使用相同的密钥和正确的权限从另一台机器通过 ssh 进行连接。根据sshd 的手册页如果您的私钥是群组/全球可访问的,它将不会被接受。
更新
Cygwin 和 Git-Bash 在查看密钥文件的权限时显示不同的结果:
# Cygwin
-rwx------+ 1 myUserName someGroup 464 Feb 11 16:43 id_ed25519
# Git-Bash
-rw-r--r-- 1 myUserName someGroupNo 464 Feb 11 16:43 id_ed25519
答案1
我知道 Windows 及其文件系统不支持权限
确实如此,甚至比 Linux 还要多。Windows 和 NTFS 文件系统都具有相同的基本“读取、写入、执行”权限,但还有一些其他权限,例如“附加”或“取得所有权”。Windows 文件权限也完全基于 ACL - 没有固定的“组”或“所有者”位置。
(一个相关区别是 Windows 和 NTFS 有一个权限继承系统。创建文件时,其权限会从父目录复制,但这些权限会被标记为“继承”且不可更改 - 您必须禁用继承才能断开链接,只有这样您才能完全更改它们。)
当将类 Unix 工具chmod
移植到 Windows 时,需要教它们如何将类 Unix 权限转换为 Windows 权限并转换回来。有时它们处理得很好,例如如果您使用 Cygwin。但在某些情况下,就像 Git for Windows 附带的 MSYS 工具一样,它们……根本不关心这一点。MSYS 'chmod' 工具仅被编程为更改文件的“只读”位,不知道如何使用 ACL,同样,MSYS 'ls' 命令甚至不会读取它们。
因此,如果您想确保您的 SSH 私钥受到保护,请使用 Windows 文件权限工具icacls
(当然也可以使用 GUI“属性”对话框)– 首先使用 禁用继承/inheritance:d
,然后使用 删除任何不需要的 ACE /remove
。(保留 SYSTEM 条目。)
您可以放心地忽略 MSYSls -l
命令显示的有关文件的信息;它的输出与实际情况不符,并且它始终会假装文件是 0644。同样,MSYSssh
命令不会抱怨权限不正确。(权限检查完全在客户端进行 - SSH 服务器甚至不知道密钥是否存储在文件中,更不用说文件是什么样子了。)
答案2
这问题解决了我遇到的实际问题。我错误地认为权限是问题所在,但事实并非如此。实际上,我尝试修改权限,即使 cygwin 显示“错误权限”(除具有读取权限的所有者之外),我也可以使用 git clone 和 ssh 而不会出现任何问题。在 Linux 下,ssh 客户端阻止我使用具有错误权限的密钥。
通常我会使用多个具有不同文件名的 ssh 密钥(从不使用默认文件名),因此我将 ssh 配置为对特定主机使用特定标识文件。这就是我首先拥有配置文件的原因。所以如果您没有配置文件,请不要担心。这是我的配置(C:\Users\myUser\.ssh\config
):
# work
Host Work-Github
HostName work-github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
PreferredAuthentications publickey
# personal
Host GitHub
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
PreferredAuthentications publickey
我将其全部替换为以下内容,从而解决了我的问题:
AddKeysToAgent yes
IdentityFile ~/.ssh/id_ed25519_work
IdentityFile ~/.ssh/id_ed25519_personal
答案3
消息针对的是 OP 关于将组更改为“用户”的评论。
我相信组的名称与区域设置有关。
因此,一个可能的解决方案是使用其 GID 545 来处理“用户”组。
就像这样:
chgrp 545 ~/.ssh/id_ed25519
其中 'chgrp' 是用于将所提供文件的组 ID(此示例中为 ~/.ssh/id_ed25519)更改为所提供组 ID(示例中为 545,是 'Users' 的同义词)的实用程序。