7

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

 2 years ago
source link: https://www.javatang.com/archives/2021/11/26/12423296.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

使用密钥的方式登录远程服务器,相比于使用密码的方式更加安全,也更加便利,不需要每次登录的时候输入密码,虽然也可以使用类似 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 [email protected] -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 [email protected] -p10022 命令登录服务器的时候,依然提示输入密码,需要使用 -i 参数指定证书,即 ssh -i ~/.ssh/local_centos7 [email protected] -p10022,这个时候会提示输入创建证书时设定的证书密码,输入密码即成功登录服务器:
file

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

ssh-add -K ~/.ssh/local_centos7

这样设置之后可以直接使用 ssh [email protected] -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


参考资料:

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)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK