ssh证书实现免密码登录

By | 2011/05/23

为了保证我们linux服务器ssh登录的安全,以防止工具小子使用程序不断的去扫描ssh的22端口并尝试猜解root用户的口令。因此需要非对称加密的证书方式实现远程登录,并避免输入密码,实现免密码登录。(注:ssh的安全也是多方面组合完成的)

先了解下ssh是怎么通过非对称密钥实现登录的吧:

首先要生成公私钥对,其中的私钥用于登录的客户端,公钥上传到服务器上(具体位置见操作)。这样客户端登录的时候要选择相应的私钥(为了保证私钥泄漏的危险,可以对其设置密码),连接后服务器询问客户端要登录的用户是什么,输入用户名后,ssh的服务器端就会检查相应用户下的公钥是否跟客户端的私钥对于,如果对应则登录成功,如果不对应则提示连接失败。

经过对网上各种方法的尝试以及自己实际配置,这里给出一套完全可行的方案,这里客户端采用的是putty:

1.留后路

咱们的vps服务器一般都在大洋彼岸(至少你看不见它),如果修改了ssh后有设置错误的地方,自己也没法登录的时候就哭吧。为了避免此悲剧的发生,留后路是必须的。方法有很多中,如果你有其他的远程操作的方式,自然是上上选;如果只有ssh的话,可以另外打开一个ssh的窗口,不要关闭即可,只要不关闭不管什么错误的操作都可以继续操作(请注意ssh窗口的无操作断开时间,别让他自己断了)。

2.密钥的生成

密钥生成的方法也有很多种,一般是通过在服务器上ssh-keygen命令和客户端工具生成,客户端工具比如putty的puttygen.exe。可是实际应用的时候你就用服务器上的ssh-keygen命令就行了,为啥呢?因为那些个客户端工具生成的公私钥对虽然是正确的,但与服务器上openssh使用的格式不对,这也是为啥网上那么多的教程,怎么配置也不行的原因。

还有一个注意事项就是服务器端的公钥文件放置的目录,这个目录是有要求的:必须位于用户目录下!因为每一个公钥文件对应于一个用户,所以要存储在其各自的目录用于区分。怎么查看用户目录呢?

1
2
3
4
5
6
[root@linux ~]# finger admin       //查询用户的相关信息
Login: admin                            Name: (null)
Directory: /home/admin                  Shell: /bin/bash
Never logged in.
No mail.
No Plan.

其中的Directory后面的”/home/admin”就是用户admin的用户目录了,在修改服务器上ssh的配置文件sshd_config的时候,指定公钥的路径就是基于这个目录的。

服务器通过ssh-keygen生成命令如下(注意在需远程登录的用户下执行):

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@linux ~]# su - admin   //切换到相应的用户
[admin@linux ~]$ ssh-keygen   //生成公私钥对
Generating public/private rsa key pair.
Enter file in which to save the key (/home/admin/.ssh/id_rsa):     //询问保存路径,可以看到默认的也是在admin的用户目录下面,此处直接回车即可
Created directory '/home/admin/.ssh'.
Enter passphrase (empty for no passphrase):           //设置证书的密码,可以根据需要设置
Enter same passphrase again:
Your identification has been saved in /home/admin/.ssh/id_rsa.
Your public key has been saved in /home/admin/.ssh/id_rsa.pub.   //记下这个路径,后面会用到。
The key fingerprint is:
9b:94:a7:12:d8:e6:f2:18:dd:4b:77:6f:41:0d:14:72 admin@linux
[admin@linux ~]$ ls ~/.ssh/         //看下是否生成成功
id_rsa  id_rsa.pub

这样公私密钥就生成好了。把里面的id_rsa下载下来,至于办法嘛自己搞定,放web目录下载、用psftp下载都行。

3.配置sshd服务

打开/etc/ssh/sshd_config 文件,修改以下地方(vi修改或下载下来再上传随意,会哪个就用哪个):

1
2
3
4
5
6
7
8
9
#Protocol 2,1   //协议版本,2更好一些,智能化程度高,也更安全
Protocol 2
#ServerKeyBits 768  //有些教程也改这个,这个是对协议1有效的,咱们的2不用改的。
#PubkeyAuthentication yes  //开启证书认证
PubkeyAuthentication yes
#AuthorizedKeysFile	.ssh/authorized_keys  //设置公钥所在的目录,这里就用到上面记下的那个目录了,填写用户目录后面的部分即可。
AuthorizedKeysFile	.ssh/id_rsa
#PasswordAuthentication yes  //既然企业了证书认证,密码认证就关了吧。
PasswordAuthentication no

配置文件一般都有对应的地方,找到修改即可,没有的直接添加就行。修改好后,运行

1
2
3
# service sshd restart   //重启ssh服务,放心的重启吧,不会把你已打开的客户端注销掉的。不用reload的原因是如果配置文件错误他不提示,可是restart提示。
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]

到这,服务上的所有操作就结束了,咱们下面再设置客户端。

4.客户端登录

之前下载下来的私钥putty是无法直接使用的,首先用puttygen进行格式转换:
puttygen界面
运行puttygen后,点击load按钮,在打开的对话框中把类型改为所有,然后找到下载回来的私钥。如果设置过密码就会提示输入密码,如图所示。如果没有问题,load按钮下面的save private key 就可以点击了,点击保存转换后的私钥。

打开putty软件,在session界面填上ip,点击connection的ssh子目录下auth项目,点里面的browse选择刚才转换的私钥。注意,这个界面上最上面的那个选项千万不要选中(默认也是不选中的),否则无法登录。设置完成后点击open开始连接;这时会有窗口提示login as,输入与证书对应的用户名即可,如果之前设置过私钥密码,同样会要求输入密码,输入之后,就可以看到可爱的shell了。

自问自答:

1.服务器的/etc/ssh 下有ssh_config、sshd_config这两个配置文件,应该修改哪个?
答 :前面那个是ssh客户端的,所以只需要配置后面的那个就行。

2.为啥要切换到相应用户生成密钥?
答 :懒呗。可以省下很多功夫。比如配置路径、配置权限等等,一句su的切换比什么都省事。

3.为啥新建了一个用户,而不用root?
当然是安全了,这样让那些坏家伙们连用户名都猜不到。

One thought on “ssh证书实现免密码登录

发表评论

电子邮件地址不会被公开