我已经在Windows 7中安装了OpenSSH 7.6以进行测试。 SSH客户端和服务器可以正常工作,直到我尝试从此窗口访问我的AWS EC2盒中的一个。

似乎我需要更改私钥文件的权限。可以使用chmod命令在unix / linux上轻松完成此操作。

Windows呢?

private-key.ppm是直接从AWS复制的,我想也是权限。

C:\>ssh -V
OpenSSH_7.6p1, LibreSSL 2.5.3

C:\>ver

Microsoft Windows [Version 6.1.7601]

C:\>


C:\>ssh ubuntu@192.168.0.1 -i private-key.ppk
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'private-key.ppk' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "private-key.ppk": bad permissions
ubuntu@192.168.0.1: Permission denied (publickey).

C:\>
C:\>
C:\>ssh ubuntu@192.168.0.1 -i private-key.ppm
Warning: Identity file private-key.ppm not accessible: No such file or directory.
ubuntu@192.168.0.1: Permission denied (publickey).

C:\>


评论

您是否尝试过修改ACL?

您的私钥是否实际上在C:\根路径中?我可以理解为什么它会抱怨,因为通常每个人都可以访问C:\中的内容。您是否尝试过将其移动到只有您自己用户才能访问的文件夹(例如C:\ Users \ username \ desktop),然后查看该消息是否仍然出现?

@Darius,是的。当您将文件从Unix / Linux复制到Windows时,权限也会被复制。我需要更改此设置,但不确定如何在Windows上执行此操作。可以使用chmod命令在unix / linux上轻松完成此操作。

@ IgnacioVazquez-Abrams,ACL?什么样的ACL?

@Sabrina您可以使用icacls命令更改权限,或者直接右键单击“私钥”,然后选择“属性”,然后在“安全性”选项卡下进行检查。并确保只有您/应该能够访问私钥的人才能访问它。如果“用户”具有读取访问权限-表示有权访问系统的任何人都可以读取该私钥。

#1 楼

您可以在Windows资源管理器中找到该文件,右键单击该文件,然后选择“属性”。导航到“安全性”选项卡,然后单击“高级”。

将所有者更改为您,禁用继承并删除所有权限。然后授予自己“完全控制权”并保存权限。现在SSH不会再抱怨文件权限太开放了。

它最终应该看起来像这样:



评论


我只想添加1)此方法适用于带有Cygwin ver CYGWIN_NT-10.0-WOW 2.3.1(0.291 / 5/3)的Windows 10(10.0.17134.191)框2015-11-14 12:42和ssh ver OpenSSH_for_Windows_7.6p1,LibreSSL 2.6.4和2)谢谢! @iBug!

–atreyu
18年7月28日在15:10



如果密钥文件在拇指驱动器/闪存盘上,则“安全性”选项卡不可用!

–迪伦B
18年8月14日在8:11

实际上,我是这样做的,但它仍然抱怨0777权限过于开放。

–亚伦·布拉姆森
'18 Sep 4'在8:25

为什么在Windows上如此困难,有人可以添加--ignore-stupid-rule命令选项吗?

–利亚姆·米切尔(Liam Mitchell)
18/12/20在20:57

谢谢,像魅力一样工作。

– giovannipds
19-09-2 17:46



#2 楼

密钥只能由其预定的用户访问,并且不能访问其他帐户,服务或组。


GUI:


[文件]属性-安全性-高级

将所有者设置为密钥的用户
删除权限条目下的所有用户,组和服务(密钥的用户除外)

将密钥的用户设置为完全控制








CLI:
< pre class =“ lang-powershell prettyprint-override”> :: # Set Variable :: Set Key="C:\Path\to\keyfile" :: # Remove Inheritance :: Cmd /c Icacls %Key% /c /t /Inheritance:d :: # Set Ownership to Owner :: Cmd /c Icacls %Key% /c /t /Grant %UserName%:F :: # Remove All Users, except for Owner :: Cmd /c Icacls %Key% /c /t /Remove Administrator "Authenticated Users" BUILTIN\Administrators BUILTIN Everyone System Users :: # Verify :: Cmd /c Icacls %Key%



评论


如果所有者实际上是一个团体怎么办?就我而言,我有一个网络服务拥有的文件,因此Cygwin认为许可权是0770而不是0700。

–太空
18年11月12日在21:29

文件必须由一个用户和一个组拥有,而不仅仅是一个组。组权限是四个八进制规范中的第三个八进制[用户是第二个],并且不能对SSH密钥进行分组或其他访问

– JW0914
18年11月13日在3:16

Unix就是这种情况。在Windows中,网络服务可以拥有一个文件,并且它是一个组

–太空
18年11月13日在18:40

Cygwin在Windows上允许POSIX API功能,但仍在基于本机UNIX的程序的规则下运行(因此在UGO设置中具有3和4个八进制权限)。虽然您可以在Microsoft的Win32-OpenSSH的GitHub上打开问题,但由于SSH密钥必须是组密钥,其他密钥不可访问,因此可能不支持以您描述的方式拥有所有权。最好遵循程序规范,而不是尝试以[可能]不受支持的方式对其进行配置。

– JW0914
18-11-16在13:52



这应该是正确的答案。感谢您的CLI选项。 GUI总是在Windows情况下很糟糕。

–shyammakwana.me
19年4月30日在20:51

#3 楼

除了ibug提供的答案。由于我在Windows内部使用ubuntu系统来运行ssh命令。它仍然无法正常工作。所以我做了

sudo ssh ...


然后它起作用了

评论


不应使用sudo打开SSH会话,因为它存在安全风险。至少(我至少知道)root用户帐户用于打开SSH会话的唯一时间是在单用户系统上(即通常在路由器OS的[OpenWrt,DD-WRT等]和其他嵌入式系统上找到) )。 SSH密钥必须仅由其所针对的用户访问,并且不能访问其他帐户,服务或组。

– JW0914
19年5月27日在18:03



@ JW0914大声笑我有一个单用户Debian服务器,唯一的(登录)用户是root。我认为额外的非root用户是没有好处的,因为它是我的个人服务器,并且仅在执行维护工作时才登录。

– iBug
19-10-28在5:12

@iBug请重新阅读我的评论,因为您似乎完全错过了第二句话...

– JW0914
19-10-28在12:02

最佳答案。在Windows上使用ubuntu shell时,有关根访问安全性的建议完全不相关

–德米特里·托尔巴(Dmitry Torba)
20-4-5的1:19

这对我有用。我做了上述解决方案,但仍收到0077警告,但此问题已得到解决。

–提莫西·莱格罗斯(Timothee Legros)
20/09/07在22:07

#4 楼

我遇到了类似的问题,但是我正在工作,并且无法更改工作计算机上的文件权限。您需要做的是安装WSL,然后将您的密钥复制到WSL中的隐藏ssh目录:

cp <path to your key> ~/.ssh/<name of your key>


现在您应该能够正常地修改权限了。

sudo chmod 600 ~/.ssh/<your key's name>


然后使用WSL进行ssh:

ssh -i ~/.ssh/<name of your key> <username>@<ip address>


评论


最好的答案在这里。

–雷电核心
20/08/31在14:42

+1-这似乎是Windows Terminal / WSL1 + 2用户的工作解决方案。我也做了一个很好的功能,并使用了sudo ssh,并且能够连接。

– alex
20 Sep 17 '14:37

#5 楼

您只需要做两件事:



禁用继承




转换继承的权限授予明确的权限




删除用户组




您将最终没有用户可以访问专用文件,这足以添加id_rsa。





评论


这是整个互联网上唯一对我有用的东西!

– Yasiel Cabrera
20/09/25'1:47

#6 楼

这似乎与您正在运行的OpenSSH的版本有关:


where ssh返回:
 %WinDir%\System32\OpenSSH\ssh.exe
%ProgramFiles%\Git\usr\bin\ssh.exe
 

ssh -V返回:
 # %WinDir%\System32\OpenSSH\ssh.exe
  OpenSSH_7.5p1, without OpenSSL

# %ProgramFiles%\Git\usr\bin\ssh.exe
  OpenSSH_7.3p1, OpenSSL 1.0.2k  26 Jan 2017
 



运行..\Git\usr\bin\ssh.exe时,它可以正常工作并且不抱怨权限,但是运行..\OpenSSH\ssh.exe会返回以下内容,即使关键ACL对我​​自己来说是完全访问权限,也没有其他要求:
 load key "t:\mykeys\rich-private.ppk": invalid format
  banana@127.0.0.127: Permission denied (publickey).
 


评论


出于整个主机的原因,不应将OpenSSH安装到Windows目录,从安全性角度来看,如果需要通过DISM或使用Reset选项修复损坏的Windows目录,将会给您带来极大的不便(已通过使用WinSxS进行了改进)目录,而不是还原为原始install.esd)。

– JW0914
18年7月9日在19:40



这就是帮助我的原因,在这种情况下,我从来没有使用过Windows ssh版本,只有Git的:(

– cudacoder
19 Mar 7 '19 at 0:27

这也是我的解决方法。看来Windows 10 Pro现在捆绑了受过专业教育的openssh版本。我被迫删除C:\ Windows \ System32 \ OpenSSH文件夹,并将git的ssh.exe添加到PATH。

–Shukri Adams
19年5月23日在16:45



使用C:\ Program Files \ Git \ usr \ bin \ ssh.exe为我“修复”它,因为C:\ Windows \ System32 \ OpenSSH \ ssh.exe不起作用

–smartins
19年11月12日在9:12

该错误消息是由于使用了无效的密钥格式[PuTTY密钥]所致,因为OpenSSH不支持PuTTY密钥(必须先通过PuTTYgen→转换将其转换)

– JW0914
20年6月29日在12:57

#7 楼

在键盘上使用以下命令,即可在Windows上使用

icacls .\private.key /inheritance:r
icacls .\private.key /grant:r "%username%":"(R)"


评论


注意:这些命令必须在命令窗口(CMD.EXE)中发出。第二个命令行在PowerShell命令窗口中对我不起作用。即使定义了环境变量USERNAME的值正确,它也会产生一条错误消息,提示“无效的参数“%username%”“。另外,在我的RSA私钥文件上调用了这两个icacls命令之后,当我在PowerShell窗口中调用ssh时,我继续收到“错误权限”错误消息。

–吉姆·菲舍尔(Jim Fischer)
20年8月27日在20:18



这很好,谢谢

– nwgat
20年8月28日在1:22

#8 楼

您可以在Windows中使用icacls而不是chmod来调整文件权限。授予当前用户读取权限并删除其他所有内容:
 Icacls <file name> /Inheritance:r
Icacls <file name> /Grant:r "%Username%":"(R)"
 


#9 楼

CMD中的一行可能会解决问题。如此处所述,从stdin添加密钥而不是更改权限:
cat /path/to/permission_file | ssh-add -k 

已添加检查密钥:
ssh-add -l


#10 楼

这只是@ JW0914的CLI回答的脚本版本,因此请首先对其进行投票:
 # DO the following in powerhsell if not already done:
# Set-ExecutionPolicy RemoteSigned


# NOTE: edit the path in this command if needed
$sshFiles=Get-ChildItem -Path "$env:userprofile\.ssh" -Force

$sshFiles | % {
  $key = $_
  & icacls $key /c /t /inheritance:d
  & icacls $key /c /t /grant  "${echo $env:username}":F
  & icacls $key /c /t /remove Administrator "Authenticated Users" BUILTIN\Administrators BUILTIN Everyone System Users
}

# Verify:
$sshFiles | % {
  icacls $_
}
 


#11 楼

由于权限问题,我无法获得所有这些答案,因此,我将分享我的解决方案:

转到%UserProfile%\.ssh

复制并粘贴id_rsa,重命名将其保存到其他文件中[example]
打开重命名的文件[example],然后将密钥替换为您自己的私钥

cd到该目录
发出后输入密码:ssh -i example example@127.0.0.1



评论


请详细说明“由于权限问题,我无法获得这些答案中的任何一个...”,因为之前至少有四个永久解决权限问题的答案。

– JW0914
20年7月2日,11:39

@ JW0914不幸的是,我无法回忆起一个月前的问题原因,更不用说五个月前了。

– isopach
20年7月2日,12:05

至少有四个其他答案提供的信息与该答案中的信息完全相同或更多,并且,如果遵循这四个答案中的任何一个,就根本不会发生任何权限问题。

– JW0914
20年7月2日,12:16

@ JW0914您已经否决了我的回答者,您还想要什么?

– isopach
20年7月2日,12:18

这里的其他选项对我也不起作用(通过GUI和多个icacls方法都尝试了)。将工作的id_rsa文件与它抱怨的文件(声称为770权限)进行比较,Windows中显示的权限是相同的。在资源管理器中进行简单的复制和粘贴似乎可以重置权限,因此不起作用,但是通过使用ROBOCOPY / COPYSEC(从提升的命令提示符下),我可以复制工作密钥文件,对其进行编辑以插入新的私有文件。键,然后此错误消失了。

–临时
20 Sep 10 '22:33

#12 楼


将公用密钥和专用密钥复制到%userprofile%\.ssh

在使用where *.pub从cmd提示符下找到密钥后,使用下面的批处理脚本:
 Md %Userprofile%\.ssh
  Copy PublicKey %Userprofile%\.ssh
  Copy PrivateKey %Userprofile%\.ssh

Cd %Userprofile%\.ssh
  Icacls .\PublicKey  /Inheritance:r
  Icacls .\PrivateKey /Inheritance:r
  Icacls .\PublicKey  /Grant:r "%Username%":"(F)"
  Icacls .\PrivateKey /Grant:r "%Username%":"(F)"
 


右键单击每个文件→“属性”→“安全性”:删除除用户外的所有用户,将用户的权限设置为“读取”



评论


脚本的重点不是避免最后一步吗?我不明白

–猎犬
20-4-18的2:22

要piggy带@Ramhound的评论,此答案与至少其他四个通过GUI,CLI和屏幕截图显示完全相同的答案有何不同?

– JW0914
20年7月2日,11:55



#13 楼


下载并解压缩OpenSSH-Win64.zip(或Win32,具体取决于您的系统)

在PowerShell中以管理员权限执行FixUserFilePermissions.ps1


评论


FixUserFilePermissions.ps1脚本不能解决所有权限问题;例如,它不会解决不使用%UserProfile%\。ssh的管理员帐户的权限问题(IIRC,为此已打开一个问题-撰写本文时,FixUserFilePermissions.ps1中尚未解决此问题) 。保证正确的文件许可权的唯一方法是使用icacls(在撰写本文时)。

– JW0914
20年7月2日,12:05



#14 楼

这是使用Microsoft工具进行操作的方法,避免了从一开始就遇到的问题。但这也应该解决此问题,这意味着您可以使用现有的密钥来遵循这些说明。
以管理员身份启动PowerShell /终端并运行以下命令:
Install-Module -Force OpenSSHUtils -Scope AllUsers

# Make sure the service isn't disabled
Get-Service -Name ssh-agent | Set-Service -StartupType Manual

# We need this service as ssh-add depends on it
Start-Service ssh-agent

cat ~\.ssh\example-key.ecdsa | ssh-add -k -

匿名胆小鬼向下按下去我。

#15 楼

使用Mingw-w64。信息:http://mingw-w64.org/doku.php

通过Git for Windows下载或直接下载。

此处提供:https://github.com/mirror/mingw-w64

git clone https://github.com/mirror/mingw-w64


它还具有其他有用的Linux命令,例如targzip

评论


这到底如何适用于所提出的问题?

– JW0914
20年7月2日,11:57

@ JW0914可以解决此问题。带有Mingw-w64的SSH不会查看密钥许可权,它将使您可以与机器可读的密钥文件连接。

–达拉斯·克拉克
20年7月3日,0:53



您所建议的完全是不安全的,永远不会被建议。 SSH密钥也只能由它们所属的用户访问,并且没有其他用户,组或服务……这样做会否定SSH密钥的目的。请在问题中搜索错误消息,或直接参考OpenSSH的手册页。

– JW0914
20年7月3日,11:20

#16 楼

我是Windows用户,正在使用Windows的bash,并按照所有步骤使用Windows GUI设置权限,但它仍然无法正常工作,并抱怨:

Permissions 0555 for 'my_ssh.pem' are too open.
It is required that your private key files are NOT accessible by others.


我在ssh命令的前面添加了sudo,它可以正常工作。希望这对其他人有帮助。

评论


但是,您是以您自己还是root用户身份登录服务器的?

– G-Man说“恢复莫妮卡”
19年11月26日在6:56

我自己运行Windows bash终端,但是启动Bash时我做了“以管理员身份运行”。

– Alex Ramses
19年11月26日在8:13

sudo不应用于SSH会话(请使用搜索引擎了解原因-这是安全隐患),并且由于权限[0555]不正确,您会收到此错误。在BSD / Linux上,UGO privs必须为600或400。如果您尝试将密钥从Windows复制到WSL,由于在Windows和WSL之间设置和维护ACL的方式,这是不可能的。而是将密钥的内容复制/粘贴到WSL上的新文件中。

– JW0914
20年7月2日,12:12

#17 楼

我在Windows 10上遇到了同样的问题,当我在计算机上创建第二个用户帐户时会引起该问题。

由于新用户也是管理员,并且可以访问我的用户文件夹,所以我做了这些步骤可以限制对我的.ssh文件夹的访问,并且它起作用了!


导航到位于C:\Users\YOU的用户文件夹

右键单击.ssh/文件夹以打开上下文菜单
Give access to...子菜单下,选择Remove access

完成!

现在尝试使用ssh登录到远程计算机!

希望对别人有帮助!

评论


这与其他答案有什么不同,其他答案表明必须修改密钥权限才能仅包括打算使用的一个用户。

–猎犬
20 May 15 '23:21

这似乎更直接一些,所以我想分享一下。

– khalifmahdi
20 May 16'0:14

@khalifmahdi这到底有多简单?有两个答案提供了屏幕截图,而至少有两个答案提供了终端的复制/粘贴命令

– JW0914
20年7月2日,12:13

#18 楼

iBug的回答很好!您可以按照此方法解决此问题。

但是在设置权限期间遇到问题时,需要清除的事情很少,我花了几分钟的时间才找出问题!

按照iBug的答案,您将删除所有权限,但是如何为自己设置“完全控制”权限?那是我一开始就卡住的地方,因为我不知道该怎么做。

禁用继承后,您将能够删除所有允许的用户或组。

完成后,

单击Add,然后单击Set a Principal,然后在底部的字段中输入SystemAdministratorsyour email addredd,然后单击check names

它将加载
,然后单击OK>类型Allow>基本权限Full Control> Okay

这将设置对SYSTEM,管理员和您的用户的完全控制权限。

之后,尝试使用该密钥进行ssh。

我遇到了同样的问题,并且使用此方法解决了该问题。
如果有任何具有该名称的用户或组,则将其加载。

-屏幕截图-

权限条目
选择主体/选择用户或组

评论


这个答案与至少其他四个答案(通过GUI,CLI和屏幕截图显示完全相同的东西)有何不同?

– JW0914
20年7月2日,12:14

我所遵循的答案引起了一些问题,这些问题我在这里已正确阐明(可能)!我是1.5年前写的! (幸运的是,在那之后的一个月,我搬到了Linux。)显然,可以用很多方法来完成相同的事情,但这并不意味着一个人不应该反过来提。

– lazycipher
20年7月5日在19:08