配置ssh免密登陆及git免密
OpenSSH是基于SSH协议实现远程登陆通信的主流工具
什么是SSH免密登陆
使用ssh登陆服务器时,往往需要验证用户的密码。例如本站使用本地写作,git推送文章到服务器的模式。写一次文章就需要一次git push加一次git pull,这实在太费力了。如果能够保存鉴权信息,登陆时不需要输入密码,那多愉快啊。这就叫SSH免密登陆。
SSH免密登陆的原理
客户端生成SSH密钥,包括一个公钥和一个私钥。将公钥提交给服务器,利用数字加密技术,使用消息摘要算法所实现的抗抵赖防篡改特性,自然就能够鉴别登陆信息。
用白话讲就是客户端生成了公钥和私钥,并将公钥提交给SSH服务器,就能够实现免密登陆。
注意是客户端生成公私钥给服务器,而不是反过来。因为是客户端要免密登陆,即客户端要向服务器自证身份,因此客户端作为安全信息的签发方。
具体实践
- 根据原理,使用ssh-keygen命令在客户端生成公私钥对
- 使用winscp工具或ssh-copy-id命令将公钥发送至服务器
- 踩坑权限,暂不确定是否有效,但这么做安全
- 其他配置与测试
1使用ssh-keygen生成公私钥对
无论你是在windows还是linux,都可以使用这个命令。我是在windows上。
ssh-keygen -t rsa
该命令会在用户的home目录下的.ssh文件夹中生成 id_rsa 和 id_rsa.pub 这两个文件,前者是私钥,后者是公钥。
- windows上,这个文件夹是 C:/user/$USER/.ssh
- linux上,这个文件夹是 /home/$USER/.ssh
- 群晖上,这个文件夹是 ~/.ssh,注意群晖的"~"可不是/home/$USER
2将公钥发送至服务器
将公钥以你熟悉的方式拷到服务器上去。并添加到authorized_keys,占一行。
我也看了一些教程,说是将公钥拷过去后直接改名authorized_keys。就纳闷,服务器也不能就光识别我一人啊,如果多人怎么办呢。然后才想明白,应该是占一行,这样就能支持多人鉴权。
3权限
我没有核验过权限是否会有问题,但我看了不少教程,指出至少要改以下,否则不生效。即:
- 用户主目录,应该不低于755
- .ssh,不低于700
- .ssh/authorized_keys,不低于600
即主目录,非属主不能写,.ssh非属主不能访问,keys文件权属主读写。
4其他配置
在/etc/ssh/sshd_config中,打开以下三个配置
RSAAuthentication yes
PubkeyAuthentication yes
# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile .ssh/authorized_keys
第一个选项我没找到,我手写上的。看名字好像挺基础的,可能SSH默认就支持。有兴趣的可以尝试并分享一下。 第二三个选项是有的。但第三个选项看注释说是系统默认,我反正也就给打开了,因为在目录下并没有看到authorized_keys2这个文件,应该不会有影响。
5测试
在你的客户端上执行
ssh user@ip
应该就能看到免密登陆的情况了,如果不行,请仔细阅读原理。
TortoiseGit免密登陆群晖git-server
最初的目的是为了git push时不需要再输入密码。
git push在使用ssh连接时,显然也可以做到免密。而这里的"免密服务"不是git提供的,而是ssh。所以要免密的第一步,就是要做到ssh登陆免密。我们前面已经做到了。
下一步,即是让TortoiseGit在push时,拿着前面生成的公私钥去登陆。然而TortoiseGit的ssh,是借助类putty工具实现的,而putty有自己的ppk私钥格式(我的理解),所以需要将前面ssh-keygen生成的私钥转化为ppk格式。
如上图,使用putty的puttygen.exe程序,在conversions菜单下,使用import key,导入id_rsa私钥,然后用 save private key,将私钥保存为ppk格式。过程中会弹出提示没有密码保护什么的,你可以酌情设个密码,即在图中的key passphrase中设个密码。
随后,在TortoiseGit中,设置putty的私钥。就可以啦。