linux通过ssh安全密钥免密连接远程主机

在生产环境中使用密码进行口令验证终归存在着被暴力破解或嗅探截获的 风险。如果正确配置了密钥验证方式,那么 sshd 服务程序将更加安全。,具体操作步骤如下:

1、首先在客户端中生成密钥对,输入命令ssh-keygen,然后直接按回车即可,如图:

在root目录下的.ssh目录下可以看到公钥文件,如图:

2、将此公钥文件传送到远程机器上,会提示输入远程主机密码,如图:

也可以直接将id_rsa.pub的文件内容复制到目标机器用户下的/root/.ssh/authorized_keys文件中,如果是其他用户就修改root为其他用户名,.ssh/authorized_keys没有就新建

3、在远程主机上,修改配置文件,只允许密钥认证(PasswordAuth),取消密码认证,如图:

设置完成后执行命令systemctl restart sshd 重启sshd服务。

重新在客户端执行ssh 10.88.5.31发现已经可以登录机器,如图:

至此,通过密钥方式登录远程服务器配置完成!

问题1:如果按照上述配置,通过ssh连接提示如下错误:

Permission denied (publickey,gssapi-keyex,gssapi-with-mic)

因为ssh 对 .ssh 目录和 authorized_keys 文件的权限要求非常严格。如果权限设置不正确,SSH 会拒绝公钥认证,因此检查目标端的.ssh目录和authorized_keys文件的权限,重新设置如下:

chmod 700 ~/.ssh                #.ssh目录一定要设置为700
chmod 600 ~/.ssh/authorized_key #authorized_key文件一定要设置为600

问题2: 如果所有都配置正确,但是通过ssh连接还是提示输入密码,此时可能是服务端的openssh版本过低,导致密钥不匹配,无法实现连接:

例如:客户端的openssh的版本为9.6, 加密算法为SHA256,如图:

服务端的openssh版本为6.6,加密算法不支持SHA256加密算法,是旧的算法,如图:

最后通过ssh连接即可

问题3: SSH连接远程服务提示错误:

Unable to negotiate with 192.168.1.1 port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss

说明 服务端(CentOS 6 老系统)只提供 ssh-rsassh-dss 这两种旧算法,而 你的客户端(OpenSSH 9.x)默认已经禁用它们,导致握手失败,解决方式有以下两种:

(1)、临时解决:

ssh -o HostkeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa user@192.168.1.1

(2)、永久解决:

编辑(或新建)~/.ssh/config,加一段:

Host 192.168.1.1
    HostkeyAlgorithms +ssh-rsa
    PubkeyAcceptedAlgorithms +ssh-rsa

注:这只是客户端妥协,每次连接仍使用 SHA-1 签名的 RSA 主机密钥;长期方案应升级服务端 OpenSSH(至少 7.4+)或换 Ed25519 主机密钥

问题4: SSH要连接的远程机器端口不是默认的22端口,比如:2222端口

编辑(或新建)~/.ssh/config,加一段,多条就加多个,如下:

Host 192.168.1.1
    Port 22222
Host 192.168.51.2
    Port 22333

标签