Linux免密登陆配置过程及原理详解
原理:
非对称加密算法
原理详解请参考:阮一峰的网络日志
简单描述:根据非对称加蜜原理,要使主机A可以免密登录至主机B,那么需要将主机A的公钥放在主机B上,在登录时,主机A用自己的私钥加密登录信息,主机B用保存的A的公钥解锁成功后即可认为是合法登录。
配置步骤:
-
生成主机A的公私钥。
-
将主机A的公钥放在主机B上。
一、生成主机A 的公私钥(该部分操作均在主机A 上):
ssh-keygen -t rsa -P ''
无需输入内容,直接空格招呼,此时主机A会生成公私钥并将其放在~/.ssh目录下。
id_rsa 私钥
id_rsa.pub 公钥
二、将主机A的公钥放在主机B上(接下来的操作均在主机B上):
将主机A的公钥传输保存在主机B的/root/.ssh/authorized_keys文件中(没有该文件就新建)。
**注意:你将主机A的公钥放在主机B的哪个用户目录下,就只能以这个用户身份免密登陆。**此例用的是root用户,可以根据实际需求选择用户。
将authorized_keys文件权限改为600
chmod 600 ~/.ssh/authorized_keys
完成权限更改后,就配置好主机A到主机B的免密登陆了。
如果想要相互免密登陆的话,两主机反向操作即可。
三、知识拓展
我们希望免密登陆哪台机器哪个账户,就把自己的公钥交给谁。因为拥有你公钥的服务器“只认公钥不认人”,所以我们一定要保管好自己的私钥。
在生成公私钥的过程中,直接在服务器中执行ssh-keygen命令,会进入交互模式,并等待用户输入生成秘钥文件的存放路径。在不指定其他路径时,系统默认会存放在“当前用户家目录的.ssh目录中”
因为当前系统账户为root。所以,默认生成秘钥路径是:/root/.ssh/id_rsa。
如果在存放路径下存在同名文件,会提示你是否覆盖,在没有搞清楚是谁的秘钥之前,最好不要覆盖,否则可能会导致私钥丢失。
确认秘钥生成路径后,会提示Enter passphrase输入密码,安全起见,可以设置密码,在每次使用秘钥的时候,都会提示我们输入私钥密码。直接回车就是不设置密码。
以下我们记录下实际操作中会遇到的问题.
目的:实现从192.168.245.129免密登陆到192.168.245.127
我们已经在129上生成了秘钥,现在需要把秘钥传输到127上,使用ssh-copy-id命令。
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.245.127
通过该命令可以将129的公钥交给同一局域网的127的root账号
使用 -i 指明要传输的公钥,然后指明账户和IP地址,进行公钥传输,这时候需要我们输入一次密码。
tips:
多数情况下,公司的sshd服务不会使用默认端口22,所以,在使用ssh-copy-id命令时可能需要指定端口号,但在centos 6和7中sshd端口指定命令略有不同,假设指定端口为10022:
centos6:ssh-copy-id -i /root/.ssh/id_rsa.pub “root@192.168.245.127 -p 10022”
centos7:ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.245.127 -p 10022
以上两种命令格式细微差别在于centos7不用加引号!
命令执行成功够会提示我们尝试进行登录验证,从129登录127,会提示输入秘钥管理密码,随后即可成功登录。
我们知道传输到127的秘钥放在root账户的/root/.ssh/authorized_keys中:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDN7f5K8PdB3LDbOsSEFgVxWAIRpyrVsZrstITZNQXQ9mEJBrT4QrZz6QoWOD5G79gI30Qh69aNIDkbvz8h4iBH27MV4IwIJvGHe8ImkGsw8QxEm883BzS97D6pi8FMHXm 3s/GtQxbptOiX27WIwVIAUzgjDri288D3Fv7+ZVVL/E/vEJIsFH467/DQ8O9+rtOd8JmYWq//qm61yriABukmDPmbJi/YLFGUNGnWeaZtQu/xgBypNpS54nPZrCHywcDYWLUx7ZrY7OkdIrIylHSGqxP16aawD2U4lcUJmg QBsLD95KL3iwFl+r/8kIFhVbUjncuDYTdtuJ2SaUD91Ezf root@flyer
注意:/root/.ssh/authorized_keys的权限需要改成600,其中可以放置不同服务器的秘钥,除了使用ssh-copy-id命令外,你也可以使用scp或者直接粘贴复制,但是粘贴复制容易出错,例如格式问题或者权限问题。
Q:已经将本机公钥推送给对方的某账户,但是仍不能免密登陆目标主机账户
可能原因:
1、SSH服务端不支持基于公钥认证或者修改了默认的公钥认证文件
服务端可以禁止使用公钥认证的机制,相关配置文件:sshd_config
配置项:PubkeyAuthentication。该参数默认是YES,表示支持公钥认证。
服务端默认使用authorized_keys作为存储用户公钥的文件,可以使用AuthorizedKeysFile配置项指定其他文件作为认证文件。
2、ssh服务端相关目录或者文件权限过大
服务端用户家目录.ssh目录权限正常为700
/root/.ssh/authorized_keys文件权限默认600
3、或者说你的秘钥没有放在对应的账户下,或者说连接错了账户
你的host B的B账户中直接ssh hostA,默认是去连接host A的B账户!
如果你把host B的B账户公钥放在了hostA中的A 账户下,远程登录时却没有指定A账户,自然不会免密登录成功。