使用密钥的方式登录远程服务器,相比于使用密码的方式更加安全,也更加便利,不需要每次登录的时候输入密码,虽然也可以使用类似 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_centos7
和local_centos7.pub
两个文件。如下:
远程服务器的设置
将本地公钥设置到服务器端
将上面生成的公钥文件(以.pub结尾)使用scp上传到服务器上,然后使用ssh登录服务器将文件内容追加到登录用户名目录下面的.ssh/authorized_keys
文件中,如下图:
可以看出上面的步骤非常繁琐,并且服务器端默认情况下不存在.ssh
目录和authorized_keys
文件。
其实可以使用ssh-copy-id
命令一行就可以自动完成上面的动作:
ssh-copy-id -i ~/.ssh/local_centos7.pub mazy@192.168.212.8 -p10022
其中-i
参数用户指定本地的公钥文件,-p
参数用于指定服务器的SSH端口。
修改证书目录和文件的访问权限
到这一步发现依然无法在客户端通过证书进行登录,这里还需要证书目录和文件的权限,这是因为默认情况下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
,这个时候会提示输入创建证书时设定的证书密码,输入密码即成功登录服务器:
但是这样每次都需要指定证书,并且还需要输入证书密码,非常不便,可以使用 ssh-add
命令将证书加入到ssh-agent的高速缓存中,其中 -K
参数为MacOS系统下的特殊参数,用来同时保存证书密码,如下:
ssh-add -K ~/.ssh/local_centos7
这样设置之后可以直接使用 ssh mazy@192.168.212.8 -p10022
命令成功登录服务器了,也可以使用 scp
命令传输文件,既不需要指定证书,也不需要输入证书密码:
使用别名登录
如果嫌每次都需要输入用户名和服务器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设置为*
,然后再下面设置一些默认选项,如下图所示:
如果 ~/.ssh/config
文件是新建的,需要设置600权限:
chmod 600 ~/.ssh/config
这样设置之后,ssh
和 scp
命令都直接可以使用服务器别名,非常方便:
客户端登录的常见错误及解决
- 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)