Total Pageviews

Wednesday, 8 November 2017

使用密钥(公钥)验证SSH连接

标题中的公钥仅是防止不同说法的人混淆。

大多数文章写的大多数都是具体操作,读者对其中过程与原因不是很清楚,仅仅是知道这样做能成功而已。

对于公钥加密是通信双方各持有一组密钥(公钥和私钥),其中公钥都是是公开的,通信各方都会拥有其他人的公钥,在此设定通信双方位A、B。

当A给B发送消息的时候,使用B的公钥加密消息后发送给B。B收到密文后使用自己的私钥进行解密,一次通信完成。

反过来B给A发送消息,使用A的公钥加密消息,A收到后密文使用自己的私钥解密,通信完成。

在这里是A和B各有一组自己的密钥。

假定C进行监听,由于C没有A和B的私钥,所以无法进行解密。

对于SSH使用密钥加密并不是使用通信的原理双方都产生一对密钥(包括公钥和私钥),而是任意一方产生一组密钥。通常环境是客户端产生。将其中一个密钥(通常是常说的公钥,后面解释)上传到服务器上进行验证。这是两个密钥都可以说是私钥,都需要保密。

这时A和B使用一组密钥。

设A为客户机B为服务器,A通过SSH请求连接B的时候,使用自己拥有密钥加密,B收到消息后使用自己拥有的密钥解密,如果解密成功,则验证通过。

但是为什么要选择上传公钥到服务器,是因为在RSA加密体系中,私钥可以设置密码,必须使用密码验证才能使用私钥,而公钥不可以设置密码。

这样将公钥上传到服务器可以实现解密验证,而客户机进行连接的时候不但需要提供私钥,还需要提供私钥的密码,即使入侵者获得了私钥,可是还需要密码才能连接到服务器。相当于使用双层验证提高了安全性。

OK,理论讲的够多了,现在开始实际操作步骤。

1、建立公钥和私钥

Linux下可以运行命令:
ssh-keygen -t rsa

Windows下可以使用SecureCRT建立:
选择工具—>创建公钥,

在这里需要注意下,一般Linux使用的是OpenSSH,需要更改下格式。


2、上传公钥

将公钥上传到服务器如下目录~/.ssh/ (~代表家目录)

并重命名位authorized_keys (配置文件设置,可以更名,但是要同时更新配置文件)

3、服务端配置

修改OpenSSH的配置文件

vi etc/ssh/sshd_config

修改如下项目

PermitRootLogin no             #禁用root账户登录,非必要,提高安全性,如果启用必须保证有其他用户可以登录系统

RSAAuthentication yes      #RSA验证
PubkeyAuthentication yes     #公钥验证
AuthorizedKeysFile     .ssh/authorized_keys  #密钥位置

PasswordAuthentication no        #禁用密码登录

修改完成后重新启动服务

service sshd restart

备注:ssh对证书的文件和目录权限比较敏感,要么根据出错提示设置好文件和目录权限,要么是把StrictModes选项设置为no

4、客户端连接
Linux下

ssh -i <KEY_LOCATION> user@<ssh_server_ip>

scp -i /blue/.ssh/id_rsa filename blue@<ssh_server_ip>:/blue

每次敲命令,都要指定私钥,是一个很繁琐的事情,所以我们可以把私钥的路径加入ssh客户端的默认配置里
vi /etc/ssh/ssh_config

IdentityFile ~/.ssh/id_rsa

如果有其他私钥的话还需要加上其他私钥路径:
IdentityFile ~/.ssh/blue_rsa


windows下可以使用SecureCRT

在连接属性中修改验证方式,

在SSH2鉴权中选择公钥,,点击属性,

选择私钥路径,

这时就可以使用密钥验证登录远端服务器了。



Windows下使用SFTP/SCP

在FileZilla下进入Edit—>Settings…中SFTP页添加密钥,

注意:FileZilla不支持密钥密码,如果有密码的私钥会提示解密并另存为PuTTY的ppk格式.

No comments:

Post a Comment