ssh 公钥私钥认证操作及原理 (转载)

本文详细介绍了SSH公钥认证的操作步骤和原理,包括客户端如何生成公钥私钥,服务器如何配置以接受公钥,以及在Windows下使用SecureCRT实现证书登录。同时,文章讨论了在Hadoop集群部署中如何实现无密码SSH登录,并探讨了公钥认证的安全性及其工作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是转载自
https://blog.youkuaiyun.com/liubo2012/article/details/8894143

ssh 公钥私钥认证操作及原理

booooooooooooooooooo 2013-05-07 10:57:48 14043 收藏 3
分类专栏: linux

linux
专栏收录该内容
13 篇文章0 订阅
订阅专栏
本文基于实际Linux管理工作,实例讲解工作中使用ssh证书登录的实际流程,讲解ssh证书登录的配置原理,基于配置原理,解决实际工作中,windows下使用SecureCRT证书登录的各种问题,以及实现hadoop集群部署要求的无密码跳转问题。

ssh有密码登录和证书登录,初学者都喜欢用密码登录,甚至是root账户登录,密码是123456。但是在实际工作中,尤其是互联网公司,基本都是证书登录的。内网的机器有可能是通过密码登录的,但在外网的机器,如果是密码登录,很容易受到攻击,真正的生产环境中,ssh登录都是证书登录。

证书登录的步骤
1.客户端生成证书:私钥和公钥,然后私钥放在客户端,妥当保存,一般为了安全,访问有黑客拷贝客户端的私钥,客户端在生成私钥时,会设置一个密码,以后每次登录ssh服务器时,客户端都要输入密码解开私钥(如果工作中,你使用了一个没有密码的私钥,有一天服务器被黑了,你是跳到黄河都洗不清)。

2.服务器添加信用公钥:把客户端生成的公钥,上传到ssh服务器,添加到指定的文件中,这样,就完成ssh证书登录的配置了。

假设客户端想通过私钥要登录其他ssh服务器,同理,可以把公钥上传到其他ssh服务器。

真实的工作中:员工生成好私钥和公钥(千万要记得设置私钥密码),然后把公钥发给运维人员,运维人员会登记你的公钥,为你开通一台或者多台服务器的权限,然后员工就可以通过一个私钥,登录他有权限的服务器做系统维护等工作,所以,员工是有责任保护他的私钥的,如果被别人恶意拷贝,你又没有设置私钥密码,那么,服务器就全完了,员工也可以放长假了。

客户端建立私钥和公钥
在客户端终端运行命令

ssh-keygen -t rsa

rsa是一种密码算法,还有一种是dsa,证书登录常用的是rsa。

假设用户是blue,执行 ssh-keygen 时,才会在我的home目录底下的 .ssh/ 这个目录里面产生所需要的两把 Keys ,分别是私钥 (id_rsa) 与公钥 (id_rsa.pub)。

另外就是私钥的密码了,如果不是测试,不是要求无密码ssh,那么对于passphrase,不能输入空(直接回车),要妥当想一个有特殊字符的密码。

ssh服务端配置
ssh服务器配置如下:

vim /etc/ssh/sshd_config
#禁用root账户登录,非必要,但为了安全性,请配置
PermitRootLogin no

# 是否让 sshd 去检查用户家目录或相关档案的权限数据,
# 这是为了担心使用者将某些重要档案的权限设错,可能会导致一些问题所致。
# 例如使用者的 ~.ssh/ 权限设错时,某些特殊情况下会不许用户登入
StrictModes no

# 是否允许用户自行使用成对的密钥系统进行登入行为,仅针对 version 2。
# 至于自制的公钥数据就放置于用户家目录下的 .ssh/authorized_keys 内
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      %h/.ssh/authorized_keys

#有了证书登录了,就禁用密码登录吧,安全要紧
PasswordAuthentication no

配置好ssh服务器的配置了,那么我们就要把客户端的公钥上传到服务器端,然后把客户端的公钥添加到authorized_keys

在客户端执行命令

scp ~/.ssh/id_rsa.pub blue@<ssh_server_ip>:~

在服务端执行命令

cat  id_rsa.pub >> ~/.ssh/authorized_keys

如果有修改配置/etc/ssh/sshd_config,需要重启ssh服务器

/etc/init.d/ssh restart

客户端通过私钥登录ssh服务器
ssh命令

ssh -i /blue/.ssh/id_rsa blue@<ssh_server_ip>

scp命令

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

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

修改/etc/ssh/ssh_config

#其实默认id_rsa就已经加入私钥的路径了,这里只是示例而已
IdentityFile ~/.ssh/id_rsa
#如果有其他的私钥,还要再加入其他私钥的路径
IdentityFile ~/.ssh/blue_rsa

其他应用场景
SecureCRT密钥key远连接程ssh证书登录Linux
国内大部分人用的系统是windows,而windows下有很多ssh客户端图形工作,最流行,功能最强大的就是SecureCRT了,所以我会单独针对SecureCRT简单讲下实现ssh证书登录Linux的要点,步骤如下:

1:在SecureCRT创建私钥和公钥:主菜单->工具->创建公钥->选择RSA->填写私钥的密码->密钥长度填为1024->点击完成,生成两个文件,默认名为identity和identity.pub

2.把私钥和公钥转换为OpenSSH格式:主菜单->工具->转换私钥到OpenSSH格式->选择刚生成私钥文件identity->输入私钥的密码->生成两个文件,指定为id_rsa,id_rsa.pub

3.把公钥id_rsa.pub上传到ssh服务器,按照之前配置服务器端的证书,再配置一次。

另外,如果你之前用windows的 SecureCRT的证书登录linux的,有一天你换成了linux,并希望通过原来的私钥登录公司的服务器,那么可以把id_rsa拷贝倒~/.ssh/目录下,配置ssh客户端参考上文。

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

hadoop部署的无密码ssh登录
hadoop要求master要无密码跳转到每个slave,那么master就是上文中的ssh客户端了,步骤如下

在hadoop master上,生成公钥私钥,这个场景下,私钥不能设置密码。

把公钥上传到每个slave上指定的目录,这样就完成了ssh的无密码跳转了。

总结
ssh证书登录,在实际工作才是最常用的登录方式,本人结合了真正工作的场景普及了ssh证书登录的知识,并根据流行的hadoop部署和windows下最常用的SecureCRT实例讲解了证书登录。

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

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

Ac 客户端公钥
Bc 客户端密钥
As 服务器公钥
Bs 服务器密钥

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

认证过程分为两个步骤。

会话密钥(session key)生成

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

ref:http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646346.html
http://blog.youkuaiyun.com/cnbird2008/article/details/8038926

### 如何在 GitLab 中生成 SSH 公钥私钥 为了能够在 GitLab 上安全地进行身份验证,通常会通过生成一对 SSH 密钥公钥私钥)来实现这一目标。以下是具体的操作方法: #### 1. 使用 `ssh-keygen` 命令生成密钥对 可以通过运行以下命令生成新的 SSH 密钥对: ```bash ssh-keygen -t rsa -b 4096 -C "your_email@example.com" ``` 此命令中的 `-t rsa` 表示使用 RSA 加密算法,而 `-b 4096` 则指定了密钥长度为 4096 位[^1]。 执行上述命令后,系统会提示指定存储位置以及设置密码短语(passphrase),可以按回车键接受默认路径或者自定义路径[^3]。 #### 2. 查看已生成的公钥内容 一旦完成密钥创建过程,在 `.ssh` 文件夹下将会存在两个文件——一个是私钥(如 id_rsa 或 gitlab_en_id_rsa),另一个则是对应的公钥(id_rsa.pub 或 gitlab_en_id_rsa.pub)。要获取公钥的具体内容以便后续上传至服务器端,请利用如下指令读取其数据: ```bash cat ~/.ssh/gitlab_en_id_rsa.pub ``` #### 3. 将公钥添加到 GitLab 账户 访问 GitLab 的 Web 界面,导航到个人资料下的 **SSH Keys** 设置页面。在此处点击按钮 “Add SSH key”,并将之前复制好的公钥粘贴进去,最后保存更改即可[^2]。 #### 4. 测试连接有效性 确认一切配置无误之后,尝试通过 ssh 客户端发起测试链接请求以检验是否成功建立免密码认证机制: ```bash ssh -T git@gitlab.example.com ``` 如果返回消息类似于 `"Welcome to GitLab, @username!"` ,则表明整个流程顺利完成。 ### 注意事项 - 私钥应妥善保管,切勿泄露给他人。 - 如果遇到权限错误等问题,可能需要调整本地系统的 SSH 配置参数或是重新启动服务进程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值