转自:
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值进行比较,如果相等,则认证通过。
分享到:
相关推荐
在分布式系统管理中,使用SSH公钥认证可以避免频繁输入密码,提高工作效率,同时也能降低因密码泄露带来的风险。这个Go程序可能通过SSH协议连接到服务器,然后读取`~/.ssh/authorized_keys`文件来获取存储的公钥信息...
### SSH公钥访问详解 #### 一、基础知识 **SSH(Secure Shell)**是一种网络协议,用于计算机之间的加密登录...通过本文介绍的步骤,您可以轻松地为自己的系统设置SSH公钥认证,提升工作效率的同时保障系统的安全性。
在IT行业中,SSH(Secure Shell)是一种用于网络服务的安全协议,它允许用户通过加密的方式远程登录到服务器,执行命令或传输文件。SSH密钥对,包括公钥和私钥,是SSH协议的核心部分,用于身份验证。RSA是一种非对称...
这确保了只有拥有相应私钥的用户才能通过公钥认证登录。 **第四步:测试自动登录** 现在,你应该能够在不输入密码的情况下从管理服务器无痛地登录到目标服务器。在管理服务器上执行: ```bash ssh remote_usrname@...
在Linux系统中,SSH(Secure Shell)是一种用于在远程服务器之间进行安全通信的协议。SSH公钥认证机制允许用户在不输入密码...通过这种方式,SSH公钥认证提供了一种安全且便捷的方法来进行远程服务器之间的自动化操作。
SecureCRT 是一种流行的 SSH 客户端软件,支持多种身份验证方式,包括密码认证和公钥认证。在本文中,我们将详细介绍如何使用 SecureCRT 配置公钥和私钥登录 Linux 服务器。 公钥认证的优点 相比密码认证,公钥...
3. **配置服务器**:在服务器上,需要修改`/etc/ssh/sshd_config`文件,启用`ChallengeResponseAuthentication`和`PasswordAuthentication`,并设置`PubkeyAuthentication`为yes,以便接受公钥认证。 4. **安装...
首先,让我们了解一下SSH的密钥对认证机制。SSH支持多种密钥类型,如RSA、DSA、ECDSA等。在这个场景中,我们使用了`ssh-keygen`命令生成DSA和RSA类型的密钥对。`ssh-keygen`命令会创建一对密钥:一个私钥(例如`id_...
这些库支持公钥认证和密码认证,为开发自定义SSH客户端或服务器端程序提供了便利。 4. 实现2FA的Python库 - `pyotp`:用于生成和验证TOTP(时间同步的一次性密码)验证码,常见于许多2FA应用。 - `pygoogleauth`...
2. **公钥认证**:SSH支持公钥认证,这是一种安全的登录方式,用户可以通过自己的私钥登录,无需输入密码。公钥存储在服务器的`~/.ssh/authorized_keys`文件中,对应的私钥保留在本地。 二、SSH环境搭建 1. **安装...
3. 创建用户并指定认证方式为公钥认证:使用命令`local-user luwenju-juzi`和`password cipher luwenju-!@#`创建用户,并指定认证方式为公钥认证。 4. 客户端生成公钥和私钥,并将公钥上传到FTP服务器:使用puttygen...
SSH Secure Shell Client是一款支持SSH协议的客户端工具,它允许用户通过公钥认证方式进行登录,提供比传统密码认证更高级别的安全性。公钥认证是SSH的一种安全登录方法,其中用户拥有一个公钥和对应的私钥对。下面...
在远程主机上,需要使用ssh 运行指令,如何配置公钥,私钥,本机就能远程执行指令和脚本。
本教程中,我们将重点介绍第二种方法,即 SSH 公钥认证。以下是具体步骤: 1. **生成 SSH 密钥对**:在本地机器上,每个团队成员都应运行 `ssh-keygen` 命令生成公钥和私钥。例如: ``` ssh-keygen -C "your_...
公钥可以传给对方供认证使用。 将公钥上传至服务器 将公钥上传至服务器有两种方案: 1. 直接登陆云主机服务器的情况,可以在云主机上面用户目录的 .ssh 目录建立 authorized_keys 文件,并设置权限为 600。然后...
git 通过 SSH 进行认证连接 git 通过 SSH 进行认证连接是 Git 版本控制系统中...通过使用 SSH 协议和公钥认证机制,git 通过 SSH 进行认证连接可以提供身份验证、加密和数据 integrity 保证,保护团队成员的数据安全。
此版本的 SSH 和 SFTP/SCP 功能支持公钥认证。 SSH 的公钥身份验证,SFTP/SCP 已合并到 David Freedman 的旧版本原始包中,称为“SSH From Matlab(更新)+ SFTP/SCP”(文件夹名称“sshfrommatlab_12”)。
SSH(Secure Shell)是一种...总之,SSH密钥认证提供了一种安全无密码的登录方式,通过公钥和私钥的配合,可以在保护用户身份信息的同时简化远程登录流程。正确配置和管理这些密钥对于确保SSH连接的安全性至关重要。