我刚刚为 windows 安装了 Git 2.30.1并生成了带有ssh-keygen -t ed25519 -C "[email protected]"
. 我的私钥有 644 权限,我不能用 chmod 更改它。当我运行时 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
它确实如此,甚至比 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 条目。)您可以放心地忽略 MSYS
ls -l
命令显示的有关文件的内容;它的输出与现实不符,它总是假装文件是 0644。同样,MSYSssh
命令不会抱怨权限不正确。(权限检查完全在客户端进行——SSH 服务器甚至根本不知道密钥是否存储在文件中,更不用说文件的样子了。)这个问题解决了我遇到的实际问题。我错误地认为权限是问题所在,事实并非如此。实际上,我尝试修改权限,即使 cygwin 向我显示“错误权限”(除了拥有读取权限的所有者),我也可以将 git clone 与 ssh 一起使用,而不会出现任何问题。在 Linux 下,ssh 客户端阻止了我之前使用具有错误权限的密钥。
通常我使用具有不同文件名(从不是默认文件名)的多个 ssh 密钥,因此我将 ssh 配置为使用具有特定主机的特定身份文件。这就是为什么我首先拥有配置文件的原因。因此,如果您没有配置文件,请不要担心。这是我的配置(
C:\Users\myUser\.ssh\config
):我将其全部替换为以下内容,从而解决了我的问题: