生成密钥对

可以使用指令

ssh-keygen -t rsa -b 512 -C "$(whoami)@$(hostname)-$(date -I)"

其中-t可以指定加密算法(常见的有RSA、DSA、ECDSA等),-b指定了生成密钥的长度,而-C后面可以添加密钥说明。还可以使用-f来指定储存的位置,注意这里需要指定到具体的文件名(不存在的)。

但是即使没有在命令中指定,回车后还是会提示指定,默认在C://Users/username/.ssh/id_rsa中。id_rsa是加密方式为RSA时的默认文件名。

之后会提示要输入一个密码短语(Passphras),可以是一连串的单词或者文本,直接回车就表示不使用密码短语。密码短语可以增加破解的难度,而且即使自己的电脑丢失也不担心私钥会泄漏,因为加载私钥的时候还会要求输入密码短语。

创建成功后,我们来到目标目录,可以看到多了两个文件id_rsa和id_rsa.pub,前者便是私钥,而后者是公钥。之后私钥需要始终保留在自己的电脑上不要泄露,公钥可以上传到服务器上的对应.ssh目录中并更名为authorized_keys即可(如果authorized_keys文件已存在这说明之前添加过其他公钥,直接在这个文件新的一行中将公钥内容粘贴进去保存即可)

后来也可以再修改密码短语的内容:

ssh-keygen -f ~/.ssh/id_rsa -p

这里-f后面是私钥的路径

添加密钥对

使用ssh-add来将已经产生的私钥添加到本地的ssh-agent中,这样ssh免密登陆时才会考虑这个私钥验证。

ssh-add ~/.ssh/id_rsa

后面填写私钥的路径即可。

ssh-add -l

可以通过这条命令来查看已经添加的私钥。

我在进行这一步的时候遇到了ssh-agent找不到的情况。这个可能是因为没有打开这项服务,可以在win+R然后运行services.msc后找到ssh-agent服务(我的是一个叫做叫做OpenSSH Authentication Agent的),右键属性,先调整为手动,然后启用就可以了。这个错误可以参考Windows下使用ssh-add报错

参考:创建 SSH 密钥对

使用密钥对

上文已说,私钥是保留在本地的,而公钥是要传给服务器的,这样才能完成免密登陆。

除了可以直接使用这种添加私钥的方式,如果使用PuTTY连接,还需要将私钥做成PuTTY的私钥。

这里我也是参考的其他博客:Windows下使用SSH密钥实现免密登陆Linux服务器,只需要参考后面的生成Putty密钥文件部分以及使用PuTTY免密登陆部分就可以了(前面可能写的有点问题?对不起原作者orz)。或者使用Xshell也可以直接使用私钥配置连接。