【问题标题】:OpenSSH using private key on Windows ("Unprotected private key file" error)在 Windows 上使用私钥的 OpenSSH(“未受保护的私钥文件”错误)
【发布时间】:2018-07-30 23:57:49
【问题描述】:

我正在尝试使用 OpenSSH for Windows 使用私钥与 SSH 服务器建立简单连接,但遇到了这样的问题:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'private' 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": bad permissions

在 Linux 上,通过对私钥文件进行简单的 chmod 600 即可解决此问题,但 Windows 没有等效方法。

这听起来应该很容易,但我完全找不到任何合理的解决方案。有没有办法直接添加私钥而不通过文件,或者跳过这个隐私检查?还是我完全错过了其他东西?

【问题讨论】:

  • Stackoverflow 用于软件开发方面的帮助。您应该考虑在 Super User 而不是在这里问这个问题。

标签: key openssh


【解决方案1】:

您可以在 Windows 中使用 icacls 而不是 chmod 来调整文件权限。要授予当前用户读取权限并删除其他所有内容(这将允许 openssh 工作),这很好用:

命令提示符:

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

在 PowerShell 中,您可以通过将命令包装在对 cmd.exe 的调用中来使 icacls 工作

icacls .\private.key /inheritance:r
start-process "icacls.exe" -ArgumentList '.\private.key /grant:r "$env:USERNAME":"(R)"'

【讨论】:

  • 是的,对不起,我应该把它放进去。$env:USERNAME 是正确的(尽管大小写实际上并不重要)。尽管如此,由于 PowerShell 不喜欢 cmd.exe 样式的参数,该命令仍然不起作用,您必须将整个内容包装在对 cmd.exe 的调用中。我之所以提到这一切,是因为 PowerShell 现在是 W10 的默认命令 shell。
  • icacls 在 powershell 上似乎有点坏了。经过一段时间的试验、错误和谷歌搜索,似乎将其包装在对 cmd.exe 的调用中是正确的方法。启动进程 'icacls.exe' -ArgumentList '.\test /grant:r "$env:username":"(R)"' 应该可以工作
  • 对我不起作用,运行上述文件后文件是 0444,所以它仍然是世界可读的。
  • @PhilippeChaintreuil 我认为这是由于您的本地计算机上有更多用户造成的。默认情况下,Windows 赋予他们归档的权限。您必须遍历所有用户并删除他们的权限。
  • @PiotrZych ,这正是问题所在。谢谢!想知道为什么这些东西没有记录在任何地方。项目以敏捷模式执行,这些问题延迟了 sprint 项目,让我们看起来无能:(
【解决方案2】:

仅供参考:将“test.pem”重命名为您的原始 pem 文件名。

  1. 设置路径变量

    $path = ".\test.pem"

  2. 重置以删除显式权限

    icacls.exe $path /reset

  3. 给当前用户明确的读取权限

    icacls.exe $path /GRANT:R "$($env:USERNAME):(R)"

  4. 禁用继承并删除继承的权限

    icacls.exe $path /inheritance:r

注意:

  • 您可以根据您的文件名替换文件名。在这种情况下,它是 test.pem。
  • 您必须位于文件所在的同一目录中。
  • 您必须以管理员身份打开 power shell。

【讨论】:

    【解决方案3】:

    我是在 Windows 10 上完成的,它也解决了您在图片中看到的问题。

    您应该将文件的所有者(包含私钥)更改为具有完全访问权限的用户名。 然后删除有权访问该文件的其他用户名。

    1. 右键单击包含私钥的文件并单击属性,然后单击安全选项卡> 高级 通过单击更改按钮,您可以将所有者更改为您的用户名。 (如果您不知道用户名的名称,请在命令提示符中运行:“echo %USERNAME%”。) 更改>高级...>立即查找

    2. 删除除刚刚添加的之外的所有权限条目

    单击禁用继承> 转换继承的权限... 然后删除所有权限条目,除了您刚刚添加的条目。

    enter image description here

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        适用于 Windows 10 将密钥文件存储在用户中 例如:C:\Users\MANNEM.ssh

        确保私钥文件的权限如图所示

        【讨论】:

          【解决方案6】:

          我在 Windows 上遇到了同样的错误,但是在将私钥文件移动到“C:\Users\Administrator.ssh”后它工作正常

          【讨论】:

            【解决方案7】:

            如果我们还在寻找 SSH 问题的解决方案:

            1. 转到您的私钥并添加您计算机的 root 用户(确保您添加的是计算机的所有者)并提供全部权限。
            2. 删除其他用户。

            如果我们无法删除用户:

            1. 转到“属性”选项卡中的“安全”选项卡,然后单击“高级”
            2. 在下一个屏幕中会有一个禁用继承按钮 - 点击它。
            3. 它将打开一个弹出窗口并选择第一个选项(转换继承的权限..),然后尝试删除。

            在我的问题中,我试图将作为私钥的 ec2.prem 文件连接到 AWS,按照上述步骤后,我能够解决它。

            【讨论】:

              猜你喜欢
              • 2012-04-22
              • 2017-02-22
              • 2018-01-31
              • 1970-01-01
              • 2011-09-17
              • 1970-01-01
              • 2011-10-22
              • 2012-02-10
              • 2018-09-06
              相关资源
              最近更新 更多