配置ssh免密登陆及git免密

类别:信息技术 作者:ATScore 发布日期:2024年9月8日 浏览人数:

alt text

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_rsaid_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格式。

alt text

如上图,使用putty的puttygen.exe程序,在conversions菜单下,使用import key,导入id_rsa私钥,然后用 save private key,将私钥保存为ppk格式。过程中会弹出提示没有密码保护什么的,你可以酌情设个密码,即在图中的key passphrase中设个密码。

alt text

随后,在TortoiseGit中,设置putty的私钥。就可以啦。