和大多数使用git
或者ssh
的人一样,我用ssh-keygen
生成密钥后基本就没有再动过,更不必说研究密钥文件中的内容。不过一个机缘之下,我从RSA
密钥改用ECDSA
密钥,git
, ssh
, WinSCP
, Beyond Compare
这些个软件用起来都很惬意。然而vscode
的deploy
扩展的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
格式,所有客户端都安逸了。