macOS系统下SSH使用密钥远程登录Linux服务器

使用密钥的方式登录远程服务器,相比于使用密码的方式更加安全,也更加便利,不需要每次登录的时候输入密码,虽然也可以使用类似 sshpass 的程序记住密码,但安全性就大打折扣了。

在本地生成公钥/私钥文件

打开本地终端,使用 ssh-keygen 命令生成公钥和私钥文件:

ssh-keygen -t rsa -b 4096 -f ~/.ssh/local_centos7 -C "Local CentOS 7"

常用参数如下:

  • -t:(可选)设置密钥的加密类型,默认为rsa
  • -b:(可选)设置密钥的长度(bits)、RSA最小长度768位,默认2048位;DSA密钥长度必须是1024位(FIPS 1862标准)
  • -f:(可选)设置生成密钥文件的路径和文件名(不包含扩展名),默认路径为 ~/.ssh/,默认文件名为id_rsa(私钥文件:id_rsa,公钥文件id_rsa.pub)
  • -C:(可选)为文件设置注释说明,比如你的邮箱

生成过程中会提示输入密码,可以回车跳过,不过建议输入一个密码。上面的命令执行之后,会在~/.ssh/目录下生成local_centos7local_centos7.pub两个文件。如下:
file

远程服务器的设置

将本地公钥设置到服务器端

将上面生成的公钥文件(以.pub结尾)使用scp上传到服务器上,然后使用ssh登录服务器将文件内容追加到登录用户名目录下面的.ssh/authorized_keys文件中,如下图:
file
可以看出上面的步骤非常繁琐,并且服务器端默认情况下不存在.ssh目录和authorized_keys文件。
其实可以使用ssh-copy-id命令一行就可以自动完成上面的动作:

ssh-copy-id -i ~/.ssh/local_centos7.pub mazy@192.168.212.8 -p10022

其中-i参数用户指定本地的公钥文件,-p参数用于指定服务器的SSH端口。
file

修改证书目录和文件的访问权限

到这一步发现依然无法在客户端通过证书进行登录,这里还需要证书目录和文件的权限,这是因为默认情况下SSH将StrictModes设置为了yes,需要对登录用户目录(以/home/mazy为例)进行如下设置:

chmod 700 /home/mazy/.ssh
chmod 600 /home/mazy/.ssh/authorized_keys

同时需要确认上面的目录和文件所属于当前登录用户

或者修改 /etc/ssh/sshd_config文件,将StrictModes设置为no:

StrictModes no

最后 service sshd restart 重启SSH。

在客户端使用证书访问服务器

使用服务器用户名、ip和端口登录

回到客户端,直接执行 ssh mazy@192.168.212.8 -p10022 命令登录服务器的时候,依然提示输入密码,需要使用 -i 参数指定证书,即 ssh -i ~/.ssh/local_centos7 mazy@192.168.212.8 -p10022,这个时候会提示输入创建证书时设定的证书密码,输入密码即成功登录服务器:
file

但是这样每次都需要指定证书,并且还需要输入证书密码,非常不便,可以使用 ssh-add 命令将证书加入到ssh-agent的高速缓存中,其中 -K 参数为MacOS系统下的特殊参数,用来同时保存证书密码,如下:

ssh-add -K ~/.ssh/local_centos7

这样设置之后可以直接使用 ssh mazy@192.168.212.8 -p10022 命令成功登录服务器了,也可以使用 scp 命令传输文件,既不需要指定证书,也不需要输入证书密码:
file

使用别名登录

如果嫌每次都需要输入用户名和服务器ip比较麻烦的话,可以设置服务器别名,在客户端打开 ~/.ssh/config 文件(如果不存在则需要新建),使用下面的格式:

Host <server alias>                       # 服务器别名,如果为*则表示默认
    HostName  <server ip>         # 服务器ip地址
    Port <port>                               # SSH端口,默认为22
    User <username>                       # SSH用户名
    UseKeychain <yes/no>          # 是否使用证书
    AddKeysToAgent <yes/no>       # 是否将证书加入到ssh-agent的高速缓存中
    IdentityFile    <identify file>       # 私钥文件路径,默认为 ~/.ssh/id_rsa

可以将Host设置为*,然后再下面设置一些默认选项,如下图所示:
file

如果 ~/.ssh/config 文件是新建的,需要设置600权限:

chmod 600 ~/.ssh/config

这样设置之后,sshscp 命令都直接可以使用服务器别名,非常方便:
file

客户端登录的常见错误及解决

  • Permissions 0777 for '/Users/username/.ssh/id_rsa' are too open
    这个错误的原因是本地给证书文件的权限太高了,可以使用 chmod 400 ~/.ssh/id_rsa 命令给证书只读权限,参考:https://stackoverflow.com/a/9270753/1805493

参考资料:

Mac使用ssh公钥登录Linux
Mac Linux 配置 ssh 远程登录 Linux 无密码安全登录
ssh-keygen常用参数详解
How do you copy the public key to a ssh-server?
配置 SSH 服务以使用证书登录 Linux 服务器
linux下sshd_config的StrictModes参数
How can I permanently add my SSH private key to Keychain so it is automatically available to ssh?
Error: ssh-add: illegal option -- K
Using the SSH Config File
How to use a SSH key for GitHub on unix based systems (Linux or Mac)

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注