`

【转】ssh 公钥方式认证攻略

 
阅读更多
转自:
http://hi.baidu.com/shirdrn/blog/item/523aec06fb28ae7d02088193.html

版权声明:可以任意转载,但转载时必须标明原作者charlee、原始链接http://tech.idv2.com/2006/10/21/ssh-rsa-auth/以及本声明。

前面介绍cygwin下安装sshd时简单地提到了ssh的公钥认证。下面将这种认证方式详细地解释一下。

    为什么要使用公钥认证
    公钥认证的原理
    服务器端设置
    客户端设置
        Linux
        Windows
            使用Linux下生成的公钥和密钥的情况
            使用puttygen生成公钥和密钥
            设置 putty 使用公钥认证

为什么要使用公钥认证

通常,通过ssh登录远程服务器时,使用密码认证,分别输入用户名和密码,两者满足一定规则就可以登录。但是密码认证有以下的缺点:

    用户无法设置空密码(即使系统允许空密码,也会十分危险)
    密码容易被人偷窥或猜到
    服务器上的一个帐户若要给多人使用,则必须让所有使用者都知道密码,导致密码容易泄露,而且修改密码时必须通知所有人

而使用公钥认证则可以解决上述问题。

    公钥认证允许使用空密码,省去每次登录都需要输入密码的麻烦
    多个使用者可以通过各自的密钥登录到系统上的同一个用户

公钥认证的原理

所谓的公钥认证,实际上是使用一对加密字符串,一个称为公钥(public key),任何人都可以看到其内容,用于加密;另一个称为密钥(private key),只有拥有者才能看到,用于解密。通过公钥加密过的密文使用密钥可以轻松解密,但根据公钥来猜测密钥却十分困难。

ssh 的公钥认证就是使用了这一特性。服务器和客户端都各自拥有自己的公钥和密钥。为了说明方便,以下将使用这些符号。
Ac 客户端公钥
Bc 客户端密钥
As 服务器公钥
Bs 服务器密钥

在认证之前,客户端需要通过某种方法将公钥 Ac 登录到服务器上。

认证过程分为两个步骤。

    会话密钥(session key)生成
        客户端请求连接服务器,服务器将 As 发送给客户端。
        服务器生成会话ID(session id),设为 p,发送给客户端。
        客户端生成会话密钥(session key),设为 q,并计算 r = p xor q。
        客户端将 r 用 As 进行加密,结果发送给服务器。
        服务器用 Bs 进行解密,获得 r。
        服务器进行 r xor p 的运算,获得 q。
        至此服务器和客户端都知道了会话密钥q,以后的传输都将被 q 加密。
    认证
        服务器生成随机数 x,并用 Ac 加密后生成结果 S(x),发送给客户端
        客户端使用 Bc 解密 S(x) 得到 x
        客户端计算 q + x 的 md5 值 n(q+x),q为上一步得到的会话密钥
        服务器计算 q + x 的 md5 值 m(q+x)
        客户端将 n(q+x) 发送给服务器
        服务器比较 m(q+x) 和 n(q+x),两者相同则认证成功

服务器端设置

使用公钥认证需要对服务器进行一些设置。修改 /etc/sshd_config 的以下配置。

RSAAuthentication yes        # 启用 RSA 认证
PubkeyAuthentication yes     # 启用公钥认证
PasswordAuthentication no    # 禁止密码认证

然后重新启动 sshd。

/etc/init.d/ssh restart

客户端设置
Linux

假设客户端的用户 charlee 要以 guest 用户登录到服务器上。首先在客户端执行下面的命令。

[charlee@client:~]$ ssh-keygen -t rsa
Generating public/private rsa1 key pair.
Enter file in which to save the key (/home/charlee/.ssh/id_rsa):
Enterpassphrase (empty for no passphrase):  输入密码
Enter same passphrase again:   再次输入密码
Your identification has been sabed in /home/charlee/.ssh/id_rsa
Your public key has been saved in /home/charlee/.ssh/id_rsa.pub

生成的文件保存在主目录的 .ssh 目录下,id_rsa为客户端密钥,id_rsa.pub 为客户端公钥。

之后,通过 U 盘等方式将公钥 id_rsa.pub 复制到服务器上,并执行下列命令。

[guest@server:~]$ cat id_rsa.pub >> .ssh/authorized_keys

其中 id_rsa.pub 是客户端的用户 charlee 的公钥。

这样在客户端即可通过以下的命令连接服务器。

[charlee@client:~]$ ssh -l guest server

若不想每次登录服务器时都输入密码,可以先执行下列命令:

[charlee@client:~]$ ssh-add
Enter passphrase for /home/charlee/.ssh/id_rsa: 输入密码
Identity added: /home/charlee/.ssh/id_rsa (/home/charlee/.ssh/id_rsa)

以后登录服务器就不需要输入密码了。
Windows

假设我们使用putty连接ssh服务器。为了使用公钥认证,我们需要同时下载 puttygen 这个工具来生成 putty 所使用的密钥。
使用Linux下生成的公钥和密钥的情况

如果你按照上面的介绍,在Linux下生成了公钥和密钥的话,那么需要利用 puttygen 将密钥转换成 putty 使用的格式。

将Linux下生成的密钥 id_rsa 复制到 Windows 下。启动 puttygen,然后单击Load按钮,选择文件类型为所有文件,然后选择 id_rsa,打开。若在生成密钥时输入了密码,则打开时需要输入该密码。之后就可以在 puttygen 的主界面上单击 Save private key,保存成 putty 格式的密钥。
使用puttygen生成公钥和密钥

你也可以利用 puttygen 直接生成公钥和密钥。打开 puttygen,然后在画面下方的 Parameters 栏选择加密算法和加密长度(一般取默认值即可),最后单击 Generate。画面上会出现一个进度条,在界面上随意移动鼠标以生成随机数。最后提示生成结束,单击 Save private key 按钮保存密钥。最后将上方的Public key for pasting into OpenSSH authorized_keys file栏中的内容复制到 Linux 下用户主目录下的 ~/.ssh/authorized_keys 文件中。
设置 putty 使用公钥认证

先在putty中设置好连接的主机名、端口等信息(说明省略)。使用公钥认证需要设置两个地方:一个是 Connection 中的 Auto-login username,输入在服务器上的用户名;另一个是 Connection->SSH->Auth中的 Private key file for authentication,选择刚才转换或生成的 .ppk 格式的密钥。之后即可使用公钥认证进行连接了。

个人理解与总结:

1、客户端与服务器端使用公钥加密

将服务器端与客户端作为两个通讯的双方:

首先,客户端请求连接服务器,服务器向客户端发送客户端公钥;

接着,生成客户端会话密钥,即私钥。因为客户端和服务器端都需要知道客户端私钥,并且客户端私钥是根据会话ID在客户端生成,会话ID为p,所以需要将客户端私钥加密传输至服务器端。这里,先对客户端私钥进行了XOR操作,即r = p xor q,r再次使用服务器端公钥进行加密发送到服务器端,服务器端可以使用服务器端私钥进行解密,从而获取到客户端私钥。

然后服务器端和客户端可以进行数据的安全传送了。

1、客户端与服务器端使用公钥认证

加密并不能保证通讯中传送数据发送方身份的真实性,需要进行认证。

首先,服务器端通过生成一个随机数并使用客户端公钥进行加密后,发送到客户端,客户端自然使用客户端私钥进行解密获取随机数的值;

接着,客户端和服务器端都已经知道此次生成的随机数,再在双方都知道客户端私钥的基础上,进行运算求得(客户端密钥+随机数)的MD5值;

然后,因为客户端计算的MD5值实在客户端进行的,而验证是在服务器端,所以客户端需要将自己的计算的MD5值发送给服务器端,在发送之前要进行加密的;

最后,服务器端解密客户端发送的MD5值,与在服务器端计算的MD5值进行比较,如果相等,则认证通过。
分享到:
评论

相关推荐

    sshkey-cn 华为、思科、W3C RSA转16进制

    华为、思科、W3C RSA认证转16进制

    ssh 双机互相认证操作配置

    在远程主机上,需要使用ssh 运行指令,如何配置公钥,私钥,本机就能远程执行指令和脚本。

    来自 Matlab 的 SSH、SFTP/SCP,带公钥认证:公钥认证。 功能添加到 David Freedman 的“来自 Matlab 的 SSH(更新)+ SFTP/SCP”包。-matlab开发

    此版本的 SSH 和 SFTP/SCP 功能支持公钥认证。 SSH 的公钥身份验证,SFTP/SCP 已合并到 David Freedman 的旧版本原始包中,称为“SSH From Matlab(更新)+ SFTP/SCP”(文件夹名称“sshfrommatlab_12”)。

    SSH的ssh-keygen命令基本用法详解

    ssh-keygen 可用来生成ssh公钥认证所需的公钥和私钥文件。 使用 ssh-keygen 时,请先进入到 ~/.ssh 目录,不存在的话,请先创建。并且保证 ~/.ssh 以及所有父目录的权限不能大于 711 生成的文件名和文件位置 使用 ...

    ssh私钥泄露获取主机权限

    id_rsa.pub:公钥,很多服务器都是需要认证的,ssh认证是其中的一种。在客户端生成公钥,把生成的公钥添加到服务器,你以后连接服务器就不用每次都输入用户名合密码。 authorized_keys:认证关键文件,就是为了让两个...

    SSH,The Secure Shell:The Definitive Guide(2nd)

    SSH(Secure Shell)具有透明、保密性强、公钥认证可信的特点,并具有高度可配置的客户端/服务器体系结构,是基于TCP/IP协议、目前十分流行且健壮的网络安全与隐私保护解决方案。SSH支持安全远程登录,可用于计算机...

    SSH Secure Shell Client用public key认证登录.docx

    SSH Secure Shell Client用public key认证登录

    新一代支持多平台的免费 SSH 终端神器,太酷了

    会话认证支持 SSH 自动执行。 支持 SSH ProxyCommand 或 ProxyJump。 支持 SSH 代理转发。 支持使用密码、公钥、键盘交互、gssapi-with-mic 的 SSH 自动登录。 支持 X11 转发。 支持直接/本地端口转发、反向/远程...

    Linux A机器免密码SSH登录B机器

     SSH认证采用公钥与私钥认证方式。  2.步骤  1) A机器生成公钥/私钥对 [root@host-08 ~]# ssh-keygen -t rsa -P '' Generating public/private rsa key pair. Enter file in which to save the key (/root/...

    Linux下设置SSH通过密钥登录

    我们一般使用PuTTY等SSH客户端来远程管理 Linux 服务器。但是,一般的密码方式登录,容易有密码被 暴力破解的问题。所以,一般我们会将 SSH 的端口设置为默认的 22 以外的端口,或者禁用 root 账户登 录。其实,有一...

    SSH权威指南.pdf

    SSH(Secure Shell)具有透明、保密性强、公钥认证可信的特点,并具有高度可配置的客户端/服务器体系结构,是基于TCP/IP协议、目前十分流行且健壮的网络安全与隐私保护解决方案。SSH支持安全远程登录,可用于计算机...

    ssh-agent命令 ssh密钥管理器

    ssh-agent命令是一种控制用来保存公钥身份验证所使用的私钥的程序。ssh-agent在X会话或登录会话之初启动,所有其他窗口或程序则以客户端程序的身份启动并加入到ssh-agent程序中。通过使用环境变量,可定位代理并在...

    SSH/SFTP/SCP For Matlab (v2):使用 Ganymed-SSH2 javalib 改进了 SSH2/SFTP/SCP(支持公钥)的 Matlab 接口。-matlab开发

    支持公钥认证和改进的多命令支持。 这需要用于 Java 的开源 Ganymed SSH-2,它可以免费获得并自动包含在 zip 文件中。 对于 SFTP-GET,必须使用包含的与 Matlab 兼容的自定义 Ganymed SSH-2 Java 库。 有关文档,...

    sshdo:控制可以通过传入的ssh执行哪些命令

    在一个ssh公钥~/.ssh/authorized_keys文件可以具有一个command=""选项,它的力,当密钥被用于认证的SSH连接被执行的特定命令。 这是一种安全控制措施,可以缓解私钥泄露。 当您只需要执行一个命令时,这很好。 但是...

    python对服务器进行FTP操作并使用密匙源代码

    在实际操作中,首先需要生成SSH密钥对,包括公钥和私钥。公钥存储在服务器上,而私钥则用于在本地进行认证。在Python代码中,需要指定主机名、端口号、用户名和私钥文件路径等连接信息。随后,使用`paramiko.SSH...

    Linux系统中SSH服务基于key认证实践的过程

     简单了解了下ssh,我们再来说说它的两种用户登录认证方式,第一种基于用户名口令的方式,这种认证方式想必大家都应该知道,就是我们要想登录远端Linux系统,我们必须要输入相应的用户名口令才可以登录到远程Linux...

    Linux中配置双机SSH信任 操作说明

    使用一种被称为”公私钥”认证的方式来进行ssh登录。”公私钥”认证方式简单的解释是: 首先在客户端上创建一对公私钥(公钥文件:~/.ssh/id_rsa.pub;私钥文件:~/.ssh/id_rsa),然后把公钥放到服务器上(~/.ssh/...

    Wi-Fi User Guide for Android 4.1_4.2_4.3-v05.pdf

    AP6236_4.2最新固件移植必须的源码和固件 SDK通过瑞芯微代码服务器...客户向瑞芯微技术窗口申请SDK,需同步提供SSH公钥进行服务器认证授权,获得授权后即 可同步代码。关于瑞芯微代码服务器SSH公钥授权,请参考附录2。

    redis-windows-x86-2.8.2104.zip

    攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以使用对应...

Global site tag (gtag.js) - Google Analytics