原理:通过ssh的key生成工具,我们会得到一个公匙,一个私匙,公匙我们需要保存在服务器端,私匙我们保存在客户端 ,在客户端通过ssh客户端软件连接到服务器上,通过成对密匙较验身份信息,获取授权。
下面是简单的配置方法
如果你使用的是linux操作系统,我们可以用ssh-keygen工具生成一对秘匙,它包含私匙 id_rsa和公匙id_rsa.pub。当在询问你输入密码时直接回车。
ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hto/.ssh/id_rsa):
Created directory '/home/hto/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/hto/.ssh/id_rsa.
Your public key has been saved in /home/hto/.ssh/id_rsa.pub.
The key fingerprint is:
3e:4f:05:79:3a:9f:96:7c:3b:ad:e9:58:37:bc:37:e4 a@A
生成的密匙默认放在主目录下面的'.ssh'目录下,~/.ssh/id_rsa和~/.ssh/id_rsa.pub这两个文件。
在windows下可以用putty自带的PUTTYGEN.EXE工具生成秘匙,xshell可以从'Tools->User Key Mangager'进行操作。
我们用上传工具,把id_rsa.pub 密匙传到远程服务器端的/root目录下面。
1.sftp、scp、ssh-copy-id上传
2.cat .ssh/id_rsa.pub | ssh user@remoteserver 'cat >> .ssh/authorized_keys' 当然'.ssh'目录在存在。
接下来我们用ssh客户端软件登录远程服务器,在远程服务器端执行下面命令。
mkdir ~/.ssh
chmod 700 ~/.ssh
cat id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
rm ~/id_rsa.pub
到这里,密匙己经布好了。你可以通过这个安装好的密匙,免输入密码即可登录shell了。
如果你用了putty的key导出工具导出公匙,就不能直接这样做了,你要用ssh自带的工具,导入公匙。
ssh-keygen -i -f ~/id_rsa.pub >> ~/.ssh/authorized_keys
是在linux客户端下面,那么我们就要确保id_rsa.pub和id_rsa位于~/.ssh/目录下,这样才可以使用这个Key自动登入服务器。
在ssh工具包中,已经包含了用于将公有key文件复制到它将要无认证登录的机器上。
$ ssh-copy-id --help
Usage: /usr/bin/ssh-copy-id [-i [identity_file]] [user@]machine
$ ssh-copy-id -i id_rsa.pub web@192.168.20.179
web@192.168.20.179's password:
Now try logging into the machine, with "ssh 'web@192.168.20.179'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
更多关于key自动登录问题请参见:ssh-key自动登录问题集
如果还有问题的话,可以参看下面的操作步骤。
客户端生成公钥和私钥
生成一个名为test的公钥和私钥对,密码留空不输入。具体的说明请看这里: ssh-keygen 基本用法
$ cd .ssh/
$ ssh-keygen -t rsa -f test -C "freeoa-key"
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
配置公钥到服务器
将公钥内容添加到服务器的~/.ssh/authorized_keys 文件中。
alias 实现命令快速登陆
做好配置之后,通过ssh可以直接登录了。对经常登录的服务器,可以将ssh登录命令的alias加到 ~/.bash_profile文件中。
alias 100='ssh freeoa@192.168.10.100'
登录的时候:
$ 100
无法登录一般的原因
客户端的私钥和公钥文件位置必须位于 ~/.ssh 下。
确保双方 ~/.ssh 目录,父目录,公钥私钥,authorized_keys 文件的权限对当前用户至少要有执行权限,对其他用户最多只能有执行权限。
注意git登录,要求对公钥和私钥以及config文件,其他用户不能有任何权限。
服务器端 ~/.ssh/authorized_keys 文件名确保没错 :).
ssh-copy-id
ssh-copy-id 是一个小脚本,你可以用这个小脚本完成以上工作。这个脚本在linux系统上一般都有,不过在一些新版本上这个小工具已经没有了。
SSH为主机设置别名
在主机A上使用host_B来登录主机B(192.168.10.10)。
设置主机B别名(A)
为了能使用ssh host_B这样的命令来代替ssh root@192.168.10.10,我们需要修改下config配置文件。执行:
$ vim ~/.ssh/config
然后添加下面的内容:
Host host_B
HostName "192.168.10.10"
User "root"
IdentityFile "~/.ssh/michael"
port 22
说明:
Host 字段就是我们要设置的主机别名
HostName 是主机的ip地址
User 表示我们使用哪个用户进行登录
IdentityFile 就是我们的私钥
port 一般ssh默认的是22端口,如果您的主机设置了特殊的端口,请自行修改
设置SSH服务(B)
首先当然是要确保主机B上的ssh服务是开启状态的,接下来检查一下ssh的配置:
$ vim /etc/ssh/sshd_config
看看这个文件里面下面几行前面'#'注释是否取掉:
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
如果修改了配置文件,记得重启一下ssh服务,要确保ssh文件的权限,对于其他组用户不能太开放:
$ chmod 700 .ssh
$ chmod 600 authorized_keys
上传公钥
这里有2个方法上传我们的公钥,命令行上传和手动粘贴公钥信息。
命令行上传
在我们的主机A上,执行下面的命令(该工具上文有所介绍):
$ ssh-copy-id -i ~/.ssh/michael.pub host_B
说明:
-i后跟上公钥的绝对地址,后面再跟上主机名称,因为我们之前配置过了,所以用host_B来代替,也可以输入 root@192.168.10.10。这里因为我们还没有完成免密认证,所以需要输入主机B的登录密码,上传成功之后,整个过程就配置好了。
直接拷贝
我们首先登录到主机B上,然后手动将自己的公钥内容,粘贴到authorized_keys文件后面。不过因为容易出现格式错误,所以推荐使用命令行方式进行上传。
上传成功后,我们就可以在命令行中直接输入下面的命令,看看是不是就不用再输入密码,直接登录上去了:
$ ssh host_B