如何在 Windows 上将现有密钥添加到 openssh?

Posted

技术标签:

【中文标题】如何在 Windows 上将现有密钥添加到 openssh?【英文标题】:how to add existing key to openssh on windows? 【发布时间】:2014-09-04 15:06:57 【问题描述】:

我在很多电脑上都用过putty/plink/pageant + tortoiseGIT,发现很难用,很痛苦,不能用eclipse。

所以我决定安装 tortoiseSVN 和 windowsGIT,选择 openssh 版本而不是 putty 版本。

我在 github 中安装了一个现有密钥,并且我有生成的 ppk 文件,每次我想在 pagaent 中使用它时都必须手动加载它。

但现在我被困住了。如何使用 openssh 执行此操作?什么是 openSSH 相当于 pageant?

我怀疑我必须将 ppk 转换为 id_rsa.pub 或 simlar,但是我该如何处理它们才能在本地计算机上使用?

我是否必须像安装 putty 一样安装名为 openSSH 的东西?有没有选美之类的东西?

或者我应该放弃并重新使用 putty 进行 SSH(并且每次都必须手动加载密钥)

编辑 1。 在谷歌搜索 2 小时内未找到任何内容。我会大胆猜测,openssh 不是我需要安装的东西,而是 git install 附带的东西。我猜是因为没有提到它,windows 使用与 unix 相同的方案,即把键 ~/.ssh/... 所以我使用 puttygen 加载我的 ppk,然后“导出 openSSH 密钥”。然后我尝试将它保存为 ~/.ssh/mykey.rsa 和 mykey.dsa (不知道应该是哪个)。这不起作用 - 乌龟 git 仍然说

"could not read from remote repository"

我猜的问题是没有办法知道 puttygen 是在导出公钥还是私钥 - 它没有给你选择。

我也尝试保存为 id_rsa 和 id_dsa,没有运气。

【问题讨论】:

如果你不使用腻子来ssh你的主机,你现在用什么? OpenSSH 有客户端。它有几种风格。有些是Win32,有些是cygwin。检查您的应用支持哪个客户端。 OpenSSH 通常将私钥(id_rsa、id_dsa、身份)存储在 $HOME/.ssh 目录下。是的,您必须将 .ppk 密钥转换为 id_rsa 私钥文件。你不需要生成公钥,因为它可能已经在你的 git 和 svn 服务器上注册了。 【参考方案1】:

一些背景

OpenSSH 没有选美的等价物。嗯,差不多。它有一个 ssh-agent.exe 程序 (man page) 和一个随附的 ssh-add.exe 程序 (man page) 来向代理添加密钥。

不幸的是(对于 Windows)ssh-agent 假设的工作流程是这样的:

    您运行它,它会打印一些有关如何访问它的信息(通过ssh-add),然后从终端分离并进入后台。

    它打印的信息以 Unix shell 代码 的形式呈现,它设置了一些环境变量,所以大多数时候它应该像这样运行:

    eval `ssh-agent -s`
    

    虽然这听起来很复杂,但在任何明智的类 Unix 系统上,您的桌面环境将确保 SSH 代理在启动的早期生成,并且由它传递的环境变量被使用并被以后启动的所有程序继承用户。所以它只是在你不注意的情况下运行。

    您运行 ssh-add 将密钥提供给正在运行的 ssh-agent 实例。

    此程序使用第一步设置的环境变量定位代理。

    SSH 客户端在即将与服务器握手时尝试使用与 ssh-add 相同的方法定位代理。

如您所见,此模型不需要了解图形用户环境等,因此您不会得到任何花哨的托盘图标和某种 GUI 来将您的密钥提供给代理。

由于这显然不适合在 Windows 中创建用户会话的方式,PuTTY 实现了自己的方法来提供 SSH 代理,它自己的方法来定位正在运行的代理以及它自己的协议来与它交谈。

你能做些什么

    继续使用 PuTTY。

    我不使用 Eclipse,但我知道它使用 JGit 来处理存储库并与远程服务器通信。因此,如果您能找到一种方法告诉 JGit 如何使用您自己的 SSH 客户端程序来设置 SSH 隧道(就像 Git for Windows 使用其 GIT_SSH 环境变量所做的那样),您将能够将 Eclipse 与 PuTTY 一​​起使用。

    丧失 SSH 密钥的安全性,无需 SSH 代理即可工作。

    为此,您可以使用 PuTTY 的 puttygen.exe 将原生 PuTTY 格式的 SSH 密钥转换为适合 OpenSSH 的密钥,而无需提供加密密码,从而获得未加密的密钥,并且然后将该密钥提供给 OpenSSH:或者将其放在 %USERPROFILE%\.ssh 下并将其命名为 id_rsa(是的,id_rsa 没有任何扩展名),或者创建一个 %USERPROFILE%\.ssh\config 配置文件并在那里指定您的密钥所在的位置。格式参考this manual page。

【讨论】:

感谢您的精彩回复。我尝试加载我的 ppk 并使用 puttygen 将其转换为 openssh。它说“你确定要在没有密码短语的情况下使用 sve”(我说是!),但它仍然需要密码,即每个 git 命令(使用 openSSH)仍然需要我每次输入密码。您是如何设法去除密码的? 另外,如果您必须将文件保存为 id_rsa,您如何在一台机器上拥有多个密钥? @JohnLittle,关于关键——对我有用。我运行 puttygen 加载了我的密钥(提供密码),然后从对话框中的两个字段中删除了密码并导航到导出命令;它警告了我,但保存了未加密的密钥。要验证这一点:运行 Git Bash(如果您安装了适用于 Windows 的 Git,则您已经安装了它)并运行 eval $(ssh-agent -s) 后跟 ssh-add - 它应该打印它刚刚添加了密钥。通过运行 ssh-agent -k 完成代理。 你说得对,我搞定了。现在我很高兴。非常感谢您的帮助。【参考方案2】:

在阅读了大约 50 篇帖子并尝试了很多选择之后,我最终得到了它。

我发现的所有关于在 Windows 上设置 git 的文章都使用 plink,或者生成一个新证书(并且没有提到如何在本地安装它)。使用现有的需要这样:

1) 在 puttygen 中加载你的 ppk

2) 在转换菜单中选择“导出 OpenSSH 密钥”

3) 将文件保存在 ~/.ssh/id_rsa 中,例如c:\Users\me.ssh\id_rsa

问题:

1) 如果你想添加第二个密钥,我不知道你可以把它放在哪里。

2) 它仍然要求您每次执行 git 命令时都输入密码。那里 似乎没有办法记住它。使用 pageant,您可以加载一次密钥,然后它会记住它,直到您关闭。我尝试创建一个 _netrc 文件,但这不起作用(我猜它只有在使用 plink 时才有效,而不是 openssh)。

我不明白为什么有人会选择使用 openssh 而不是 plink。

【讨论】:

至于问题: 1) OpenSSH 客户端的配置文件允许为您访问的每个主机指定密钥文件的位置,或者该主机的别名; 2) 那是因为没有使用代理,所以客户端每次都找到密钥并要求输入密码来读取它。处理它的一种方法是使用未加密的密钥。 好的,上面的所有说明都不起作用。我在 .ssh 目录中有一些其他文件使它工作。我现在已经删除了那些。当我加载我的 ppk 并导出到 openSSH 并将其命名为 .ssh/id_rsa 时,git bash 无法连接。回到绘图板。 这可能是由于您删除了known_hosts 文件,因此 SSH 客户端不再信任任何服务器。设置好密钥文件后,尝试从 Git Bash 运行 ssh your_git_user@your_git_server,当 SSH 客户端询问您是否信任要连接的服务器时,回答“是”。这个问题不会再问了。 我没有删除已知主机,只删除了其他尝试类型的密钥保存。我尝试了 ssh mygituser@githum.com 并返回“权限被拒绝(plublickey)” 好的,我想我到了那里,我删除了 github 中定义的 3 个键,然后重新开始。我保存了我的ppk的openssh版本,先把那句删了,现在不用密码就可以用git了,很开心。

以上是关于如何在 Windows 上将现有密钥添加到 openssh?的主要内容,如果未能解决你的问题,请参考以下文章

如何在单击的菜单项上将活动类附加到现有类?

在 Windows Server 2008 R2 上将 HKCR\CLSID\* 密钥的所有者更改为管理员

如何在移动设备上将现有按钮固定到底部? (引导)

如何在 Windows 上将 Python 3.8 切换到 Python 3.6 作为默认值?

在 Windows 上将 Python 添加到 PATH

ubuntu安装vmware12出现cannot ope dev/vmmon及modprobe vmmon提示密钥无效的解决办法