ssh-keygen生成密钥格式错误问题

和大多数使用git或者ssh的人一样,我用ssh-keygen生成密钥后基本就没有再动过,更不必说研究密钥文件中的内容。不过一个机缘之下,我从RSA密钥改用ECDSA密钥,git, ssh, WinSCP, Beyond Compare这些个软件用起来都很惬意。然而vscodedeploy扩展的sftp访问功能就用不了了,查看日志发现是sftp: Cannot parse privateKey: Unsupported key format,于是开始了解决这个问题的漫漫长路。

首先deploy扩展的官网自然是有这个问题的,https://github.com/mkloubert/vscode-deploy-reloaded/issues/171就给出了一个有用的解决方案以及说明。ssh-keygen默认生成的密钥是OpenSSH格式的(密钥文件以-----BEGIN OPENSSH PRIVATE KEY-----开头),deploy不支持这种格式的密钥。因此需要使用

ssh-keygen -m pem -t ecdsa -C private-key-name

命令指定输出的密钥为PEM格式(密钥文件以-----BEGIN EC PRIVATE KEY-----开头)。

这里就有个问题了,我的密钥已经生成很久,而且已经把公钥导出到各种服务器上,重新生成一个新公钥的方法过于简单粗暴。既然deploy只支持PEM格式,那就把我已有的OpenSSH格式密钥转换成PEM就好了。

网上一搜,结果一堆:

1. 使用ssh-keygen命令转换

ssh-keygen -i -f ~/.ssh/id_ecdsa > ~/.ssh/id_ecdsa.pem

然而运行命令的结果是do_convert_from_ssh2: parse key: invalid format,失败。

2. 使用PuttyGen.exe工具转换

按照网上的流程,导入导出,结果Unable to save key file,又失败。

大部分结果都是以上两种方法,在我这边都失效了,只要继续搜,终于在经过一天的寻找后,找到了一个大神在一个我从来没有听过的网站上的仅有4赞的回复,最终解决了我的问题。原始链接为https://security.stackexchange.com/questions/218155/convert-ecdsa-keys-pem-openssh

要想把密钥从OpenSSH格式转为PEM格式,需要修改密钥口令操作。(这操作差点闪到我的老腰。)具体则是以下命令:

ssh-keygen -p -m pem -f ~/.ssh/id_ecdsa

注意这里并没有指定原始口令或新口令,因为“修改口令”并不需要真的有口令。(额......)当然如果真有口令,需要额外加上-P old-password-N new-password参数。

至此,密钥文件成功转换为PEM格式,所有客户端都安逸了。

添加新评论