爱技术 & 爱分享
爱蛋蛋 & 爱生活

ssh免密码登陆

什么是SSH

SH(Secure Shell)是一种提供网络安全的传输协议。它保证了在网络上的数据并非明文传输,目前使用SSH登录远程终端已经是通用方式。

SSH登录时有两种验证方式

基于密码的安全验证,它要求用户在每次登录服务器时输入密码,服务器端验证通过后即登录成功。

基于密钥的安全验证,客户端的公钥会预先保存在服务器端,当登录时,服务器端会使用该公钥做验证,如果验证成功,用户不需输入密码即完成登录。

为了避免每次都输入密码这种重复性工作,我们选择第二种方式进行远程登录。

公钥认证的基本思想

对信息的加密和解密采用不同的key,这对key分别称作private key和public key,其中,public key存放在欲登录的服务器上,而private key为特定的客户机所持有。

当客户机向服务器发出建立安全连接的请求时,首先发送自己的public key,如果这个public key是被服务器所允许的,服务器就发送一个经过public key加密的随机数据给客户机,这个数据只能通过private key解密,客户机将解密后的信息发还给服务器,服务器验证正确后即确认客户机是可信任的,从而建立起一条安全的信息通道。

通过这种方式,客户机不需要向外发送自己的身份标志“private key”即可达到校验的目的,并且private key是不能通过public key反向推断出来的。

这避免了网络窃听可能造成的密码泄露。

客户机需要小心的保存自己的private key,以免被其他人窃取,一旦这样的事情发生,就需要各服务器更换受信的public key列表。

生成密钥对

在本地终端生成密钥对

关于 ssh-keygen 命令的使用请看这里 SSH-KEYGEN

ssh-keygen // 加密方式默认使用RSA,可以通过 “ssh-keygen -t 加密方式” 指定加密方式

生成过程中会询问设置密钥对的保存位置和打开密码。按enter键使用默认设置即可。

每次执行 ssh-keygen 产生的私钥文件都会不同

如果文件”~/.ssh/id_rsa”存在,会提示是否覆盖该文件,可选择”n”不覆盖该文件而使用已有的id_rsa文件

如果选择”y”则会重新生成”~/.ssh/id_rsa”文件。

接下来会提示输入passphrase,回车确定使用空的passphrase,再次回车确认(这里也可以输入passphrase,相当于ssh时登录的密码)。

此时会在”~/.ssh”目录下生成名为id_rsa和id_rsa.pub的私钥文件和公钥文件。

这时有两种方案:

使用密码登录到服务器端,将公钥字符串copy到”~/.ssh/authorized_keys”文件内。

vi ~/.ssh/authorized_keys
// copy 公钥字符串

如果.ssh目录尚未建立,需要先创建并且修改权限:

mkdir ~/.ssh
chmod 700 ~/.ssh

如果authorized_keys文件是新创建的,需修改文件权限

chmod 600 ~/.ssh/authorized_keys

也可以直接使用 scp 复制到远端服务器

scp /home/test/.ssh/id_rsa.pub root@192.168.192.168: ~/.ssh

将公钥追加到授权KEY里面

在服务器终端下输入下面的命令

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

如果远程服务器上已经存在”~/.ssh/authorized_keys”文件,那么需要编辑服务器上”~/.ssh/authorized_keys”文件,将客户端机器上的”id_rsa.pub”文件内容追加到”~/.ssh/authorized_keys”文件中。

如果服务器上没有”~/.ssh/authorized_keys”文件,执行下面这条命令

cp  id_rsa.pub  authorized_keys

即将公钥复制为authorized_keys文件

验证是否设置成功

ssh username@server-ip

此时应该能够跳过输入密码的提示,直接登录到远程终端。

如果仍然需要输入密码,最有可能的原因是上面第三步文件权限配置的有问题。

配置服务器别名,使用别名代替ip地址

虽然经过上面的配置,我们不用在每次登录时都输入密码。当仍然需要我们输入用户名和服务器ip。有没有可能把这一步骤也省略呢?答案是肯定的,通过配置服务器别名的方式,登录时只需输入别名即可。

打开~/.ssh/config文件,添加以下内容:

Host server-alias           # server-alias为SSH链接的服务器别名
HostName server-ip  # 服务器地址
Port 22
User username           # 服务器端用户名
PreferredAuthentications publickey 
IdentityFile ~/.ssh/id_rsa   # 私钥地址,默认为 ~/.ssh/id_rsa

验证 : 以后即可通过以下命令登录远程服务器

ssh server-alias

如果登录未成功,请仔细检查每项的配置是否正确。

总结

经过上述配置,有效的简化了登录操作,会为我们节省不少时间。

更重要的是,所有底层使用SSH的程序,都因此而简化了操作步骤。比如:

用于传输文件的scp和rsync命令。只需输入:

scp file server-alias:/dir

如果服务器端上配置了git远程仓库,只需输入:

git clone server-alias:/git-repo

你会发现除了使用简易的别名代替了ip地址外,输入密码的步骤也被省略掉了!

参考文章:

http://www.jianshu.com/p/03effb53705c

http://www.jianshu.com/p/e9db116fef8c

http://blog.csdn.net/leexide/article/details/17252369

https://www.liaohuqiu.net/cn/posts/ssh-public-key-auto-login/

赞(0) 传送门
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。墨影 » ssh免密码登陆