扩展:ssh密钥认证

Ansible配置ssh密钥认证会方便很多,MySQL搭建MHA高可用也需要用到,所以单独写一篇笔记。

工作原理

1、服务器A生成一对密钥,分别为公钥跟私钥
2、服务器A将公钥发给远程服务器,私钥保留
3、远程服务器通过公钥验证服务器A的私钥
4、验证成功,即可通过服务器A免密登录远程服务器

ssh-keygen命令

该命令不加参数为交互式执行

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/rsa/id_rsa
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/rsa/id_rsa.
Your public key has been saved in /root/.ssh/rsa/id_rsa.pub.
The key fingerprint is:
SHA256:8sKOrUtlAmnswKU4W0ZErdYNXZBG1OCjatWHn9nmWQw root@master
The key's randomart image is:
+---[RSA 2048]----+
| o+o +=*.        |
|ooo.o.+ .        |
|+oBo +o          |
| Oo..o.o         |
|... + * S E      |
|   o = = + o     |
|  o . o = o o    |
| . . + . o o     |
|    +oo   o      |
+----[SHA256]-----+

$ cd /root/.ssh/rsa/
$ ls
id_rsa  id_rsa.pub

如上,ssh-keygen不加参数则会提示输入密钥生成路径,回车为默认路径;
还有密钥是否加密,回车为不加密。
其中后缀名.pub为公钥,没有后缀为私钥。

-f参数指定生成密钥的路径

$ ssh-keygen -f /root/.ssh/rsa/id_rsa_tz

-P参数为密钥设置密码

$ ssh-keygen -P '123' -f /root/.ssh/rsa/id_rsa_tz

#不为密钥设置密码
$ ssh-keygen -P '' -f /root/.ssh/rsa/id_rsa_tz

注意同时指定-f跟-P参数使用ssh-keygen命令将不会进入交互模式

-p参数为私钥添加、取消、修改密码

#此命令会进入交互模式
$ ssh-keygen -f /root/.ssh/rsa/id_rsa_tz -p

-t参数生成指定类型的密钥

$ ssh-keygen -t dsa -P '' -f /root/.ssh/rsa/id_rsa_tz

ssh2密钥类型包括dsa、ecdsa、ed25519、rsa这四种。

-b参数生成指定位长的密钥

$ ssh-keygen -b 1024 -t dsa -P '' -f /root/.ssh/rsa/id_rsa_tz

-y参数根据私钥生成对应的公钥

$ ssh-keygen -f /root/.ssh/rsa/id_rsa_tz -y > id_rsa_tz.pub

如果不使用重定向,则会将公钥打印在屏幕上。

ssh命令

-i参数指定对应的密钥连接对应的主机

$ ssh -i ~/.ssh/id_rsa_tz tz@10.154.0.112

ssh-copy-id命令

作用:复制公钥到其他主机

-i参数将指定的公钥发给远程主机。
远程主机会把该公钥存放在/root/.ssh/authorized_keys文件中。

$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.154.0.112 

-p参数指定远程主机端口号,有时应生产环境要求需要更改ssh端口号保障安全性,这时可以使用-p手工指定端口号。

#centos6
$ ssh-copy-id -i ~/.ssh/id_rsa.pub "root@10.154.0.112 -p 2222"

#centos7
$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.154.0.112 -p 2222

问题汇总

1、ssh服务器禁用基于公钥认证

$ vim /etc/ssh/sshd_config 
...
PubkeyAuthentication yes

2、ssh服务端修改了默认的公钥认证文件路径

$ vim /etc/ssh/sshd_config 
...
AuthorizedKeysFile /root/.ssh/authorized_keys

3、ssh服务端相关目录或者文件的权限过大
.ssh目录的权限正常700
authorized_keys文件的权限默认为600

4、ssh服务端的authorized_keys文件中包含windows字符
authorized_keys文件使用win系统打开处理,会出现win的换行符等符号不符合unix编码规范,可使用dos2unix解决

$ yum install -y  dos2unix
$ dos2unix /root/.ssh/authorized_keys

5、ssh客户端连接服务端时,对应用户名写错
老司机疲劳驾驶常犯错误,需要谨慎对待。

6、ssh客户端的私钥权限过大
私钥权限默认为600,权限过大会报如下错误

Permissions 0644 for ‘/root/.ssh/id_rsa’ are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: /root/.ssh/id_rsa

7、创建密钥对时,没有使用默认的密钥名称
使用自定义的密钥名称时,需要指定-i参数指定私钥,否则无法基于密钥认证。

学习来自:朱老师博客

posted @ 2021-04-24 20:29  努力吧阿团  阅读(244)  评论(0)    收藏  举报