如何将使用PuTTYgen(Windows)生成的SSH密钥对转换为ssh-agent和Keychain(Linux)使用的密钥对

513

我使用PuTTYgen生成了密钥对,并使用Pageant登录,这样当我的系统启动时,只需要输入一次密码短语。

在Linux中如何实现这一点?我听说过keychain,但我听说它使用不同的密钥对格式 - 我不想更改我的Windows密钥,并且如果我能以相同的方式无缝连接到Windows和Linux,那将是很好的。


在Linux中使用密钥不应该有任何问题...只需将它们复制并添加到授权密钥中即可...尽管我承认我并不完全理解你的问题。 - Randall Hunt
17
不,我知道这一点:PuttyGen和ssh-agent使用的关键格式不同,它们必须明确地进行转换。请参见下面Kaleb详细的答案。 - TCSGrad
10个回答

769

puttygen支持将您的私钥导出为OpenSSH兼容格式,然后您可以使用OpenSSH工具重新生成公钥。

  1. 打开PuttyGen
  2. 点击“加载”
  3. 加载您的私钥
  4. 进入 转换-> 导出 OpenSSH 并导出您的私钥
  5. 将您的私钥复制到 ~/.ssh/id_dsa (或id_rsa)。
  6. 使用ssh-keygen创建公钥的RFC 4716版本

ssh-keygen -e -f ~/.ssh/id_dsa > ~/.ssh/id_dsa_com.pub
  • 将 RFC 4716 版本的公钥转换为 OpenSSH 格式:

  • ssh-keygen -i -f ~/.ssh/id_dsa_com.pub > ~/.ssh/id_dsa.pub
    

    请参阅此处此处以获取更多信息。


    13
    如果你遇到了类似于“必须确保你的私钥文件不被其他人访问”的错误,像我一样,可以运行命令 cd ~/.ssh 然后再运行 chmod 700 id_rsa - expert
    83
    你的意思是 chmod 600 id_rsa。这个文件不需要可执行权限。 :) - sig11
    2
    这个答案对我来说是使用无密码密钥从Windows命令行获取ssh的关键(特别是用于git访问)。如果我早点看到它,就可以节省我数小时的痛苦!谢谢! - cori
    2
    Puttygen可以从CLI执行吗? - CMCDragonkai
    29
    我假设这是新的内容,但如果你在puttygen中打开你的私钥,它会自动在界面上显示一个与OpenSSH兼容且可复制的公钥字符串。 - UpTheCreek
    1
    这对于想要将Git for Windows作为ssh客户端而不是PuTTY的用户也非常有帮助。谢谢! - murchu27

    189

    如果你手头只有一个PuTTY格式的用户公钥,你可以使用以下方法将其转换为标准的openssh格式:

    ssh-keygen -i -f keyfile.pub > newkeyfile.pub
    

    参考资料

    文章摘录

    我总是忘记这个,所以我要写在这里。非技术人员请绕道。

    在Windows上制作一个键的最常见方式是使用Putty/Puttygen。Puttygen提供了一个很好的实用程序来将Linux私钥转换为Putty格式。然而,没有解决的问题是,在使用puttygen保存公钥时,在Linux服务器上它不会起作用。Windows将一些数据放在不同的区域,并添加了换行符。

    解决方案:当你在puttygen中创建密钥对并到达公钥屏幕时,复制公钥并将其粘贴到一个带有.pub扩展名的文本文件中。这将节省您的系统管理员几个小时的烦恼和阅读像这样的帖子。

    然而,系统管理员们,你们会遇到那些出问题的密钥文件,它在认证日志中不会显示任何错误消息,除了"找不到密钥,尝试密码",即使别人的密钥都在正常工作,而且你已经将这个密钥发送给用户15次。

    ssh-keygen -i -f keyfile.pub > newkeyfile.pub
    

    需要将现有的puttygen公钥转换为OpenSSH格式。


    2
    此外,您可能希望从“评论:”行中复制用户的评论,并将其粘贴到新密钥的同一行中,用空格分隔。我不知道为什么ssh-keygen不会默认执行此操作。 - Tobia
    6
    这给我报错:解码块失败:无效格式 - Chris Stryczynski
    如果您阅读了原始文章,关键细节在于,只有在通过puttygen的UI复制密钥时,此方法才有效,它不会将已由puttygen生成的文件转换为密钥。 - slm
    我可以使用同一工具将其转换为另一种方式吗? - Olle Härstedt
    我遇到了与@ChrisStryczynski相同的错误。奇怪的是,我正在查看的文件似乎是十进制的?我假设这是puttygen保存的文件,而不是从窗口复制的文本。 - vastlysuperiorman
    显示剩余2条评论

    165

    PuTTYgen的新版本(我的是0.64)能够显示OpenSSH公钥,以便复制到Linux系统中的.ssh/authorized_keys文件中,如下图所示:

    enter image description here


    7
    本答案介绍如何在使用OpenSSH格式的远程主机上设置密钥身份验证。但要在Linux客户端上使用Putty生成的密钥,本答案是不够的。我按照被接受的答案操作,结果非常好。 - wberry
    1
    这是一个很好的答案,可以帮助你将Putty密钥导入GitHub,谢谢! - Adam Nofsinger
    1
    最佳答案涵盖了私钥和公钥的使用,但有些冗长,而且在许多情况下,您只需要公钥,这种情况下,这个答案是最快和最简单的,谢谢。(原问题并不完全清楚他们是否需要私钥和公钥都要。) - undefined

    56

    如果您想从PuTTY格式的密钥文件中获取私钥和公钥,可以在*nix系统上使用puttygen。对于大多数基于apt的系统,puttygenputty-tools软件包的一部分。

    从PuTTY格式的密钥文件中输出私钥:

    $ puttygen keyfile.pem -O private-openssh -o avdev.pvk

    获取公钥:

    $ puttygen keyfile.pem -L


    如果由于某种原因你必须在Windows系统上执行此操作(无法安全地将所有密钥传输到*nix系统),并且有太多密钥,使用GUI界面会很麻烦,那么可以尝试在Cygwin下编译Unix源代码。这样,puttygen.exe将提供类似上述CLI“批处理模式”的功能。 - Toddius Zho
    2
    OSX:brew install putty - Juha Palomäki
    1
    应该反过来写:puttygen inppk -O private-openssh -o outpemputtygen inppk -L(或者 ssh-keygen -y -f outpem)。 - dave_thompson_085

    36

    这并没有展示比@John Jawed的回答中已经有的更多内容。 - Martin Prikryl
    参数解释其所代表的内容。+1 - danronmoon
    1
    太好了!这个可行。另外,在MacOS上安装putty:brew install putty。 - Dylan B

    15

    最近我遇到了这个问题,因为我从Linux上的Putty转移到了Linux上的Remmina。所以我有很多Putty的PPK文件在我的.putty目录中,因为我已经使用它们8年了。对于这个问题,我使用了一个简单的bash shell for 命令来处理所有文件:

    cd ~/.putty
    for X in *.ppk; do puttygen $X -L > ~/.ssh/$(echo $X | sed 's,./,,' | sed 's/.ppk//g').pub; puttygen $X -O private-openssh -o ~/.ssh/$(echo $X | sed 's,./,,' | sed 's/.ppk//g').pvk; done;
    

    非常迅速而且直截了当,为putty拥有的所有文件完成了工作。如果它发现一个带有密码的密钥,它会停止并首先要求输入该密钥的密码,然后才会继续。


    2
    对于像我这样懒的人,以下是在 Ubuntu 上获取 puttygen 的复制粘贴方式:sudo apt-get install putty-tools - Mr. Developerdude
    1
    “简单” - 我不想看到复杂的! - Alex Jansen

    8

    15
    如果你必须使用现有的密钥,那么这不是一个可选项。 - expert

    6
    我认为TCSgrad几年前想问的是如何使Linux的行为类似于他的Windows机器。也就是说,有一个代理(pageant)保存了一个私钥的解密副本,因此只需要一次输入口令。然后,ssh客户端putty可以登录到公钥被列为“已授权”的机器而不需要密码提示。
    这个情况的类比是,在作为ssh客户端的Linux中,有一个代理保存了一个解密的私钥,所以当TCSgrad输入“ssh host”时,ssh命令将获取他的私钥并且无需提示密码即可进行连接。host当然必须在~/.ssh/authorized_keys文件中保存公钥。
    通过使用ssh-agent(pageant的类比)和ssh-add(类比于向pageant添加私钥),可以实现这种情况的Linux类比。
    对我有效的方法是使用: $ ssh-agent $SHELL 那个$SHELL是我需要让代理运行并保持运行的魔法技巧。我在互联网上找到了它,它结束了数小时的头痛。
    现在我们有pageant的类比正在运行,一个没有加载密钥的代理。
    输入 $ ssh-add 本身会添加(默认情况下)~/.ssh中默认身份文件中列出的私钥。
    可以在这里找到更多详细信息的网络文章。

    0

    PPK → 使用PuttyGen和Docker生成OpenSSH RSA。

    私钥:

    docker run --rm -v $(pwd):/app zinuzoid/puttygen private.ppk -O private-openssh -o my-openssh-key
    

    公钥:

    docker run --rm -v $(pwd):/app zinuzoid/puttygen private.ppk -L -o my-openssh-key.pub
    

    另请参阅https://hub.docker.com/r/zinuzoid/puttygen


    -2

    比重新打开puttygen还要快的方法是:

    1. 复制公钥文件。
    2. 在副本中,在开头加上“ssh-rsa”这个单词。
    3. 删除开始/结束注释行和所有其他换行符。
    4. 保存。结果是一个适用于openssh的单行密钥。

    这个问题是关于使用密钥链,因此涉及到私钥而不是公钥。 - Martin Prikryl

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接