文档章节

使用 RSA 密钥对进行 SSH 登录验证

小木头的冬天
 小木头的冬天
发布于 2015/04/18 17:10
字数 1450
阅读 44
收藏 0
点赞 0
评论 0

1. 生成密钥对


OpenSSH 提供了ssh-keygen用于生成密钥对,不加任何参数调用即可:

[root@localhost ~]# ssh-keygen
Generating public/private rsa key pair.Enter file in which to save the key (/home/xiaq/.ssh/id_rsa):

如果你以前没有生成过密钥对,直接回车就行。然后会问你“passphrase”,这是用来加密私钥的密码。如果你不知道怎么用,直接用空密码也行(当然,这样会降低安全性)。按两次回车后密钥对就生成好了:

Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/xiaq/.ssh/id_rsa.2.Your public key has been saved in /home/xiaq/.ssh/id_rsa.2.pub.The key fingerprint is:8a:77:ec:a1:77:42:8d:5d:ab:17:33:ac:87:06:20:3c xiaq@blackieThe key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|   .             |
|    E .     .    |
|     o .S+ o .   |
|     . o+ o *    |
|    . o.+. + +   |
|     . +o.* o    |
|      ...+ o     |
+-----------------+

嗯,会有一堆很花哨的输出,可以全都不管。这样在你刚才指定的地方就有了一对密钥,其中私钥就是上面指定的名字,公钥则多一个“.pub”后缀。

2. 上传密钥


把你的公钥用scp上传到了远程远程ssh服务器,并把公钥的内容追加到ssh服务器的 ~/.ssh/authorized_keys:

[root@localhost ~]# scp ~/.ssh/id_rsa.pub user@host:
[root@localhost ~]# ssh user@host
[root@localhost ~]# cat id_rsa.pub >> ~/.ssh/authorized_keys

或者等价地

[root@localhost ~]# cat ~/.ssh/id_rsa.pub | ssh user@host 'cat >> ~/.ssh/authorized_keys'

再或者

ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.113

COMMENT: 顾名思义,authorized_keys 里面可以存多个公钥。所以在这里用 cat id_rsa.pub >> ~/.ssh/authorized_keys。不过,如果你以前没有这个文件,直接 cp id_rsa.pub ~/.ssh/authorized_keys 也是可以的……

如果你的 ~ 下没有 .ssh 目录,建立之即可。

NOTE: OpenSSH 提供了一个脚本ssh-copy-id用于上传公钥。其作用就是自动化完成以上的操作,例如在自己的机器上执行

[root@localhost ~]# ssh-copy-id -i .ssh/id_rsa.pub user@remoteserver.com

man ssh-copy-id完整语法 ssh-copy-id [-i public_key] [user@]machine

3. ~/.ssh 相关文件权限


为防止你的私钥被恶意用户获取和/或篡改,以及你的公钥信息被恶意用户篡改,ssh 对 ~/.ssh 的文件权限有着严格的要求。如果权限不对,公钥验证不会正常工作。

NOTE: 准确说来,这取决于 sshd 的配置。但不管怎样,出于安全性考虑,按如下步骤配置文件权限还是必要的。

在本地和远程两台机器上,都确认 ~/.ssh 目录只有你有 rwx 权限,其他人没有任何权限:

[root@localhost ~]# pwd/home/xiaq
[root@localhost ~]# chmod 700 .ssh
[root@localhost ~]# ls -dl .sshdrwx------ 2 xiaq xiaq 4096 Jun  6 11:29 .ssh/

在本地机器上,确认私钥只有你有 rw 权限,其他人没有任何权限:

[root@localhost ~]# pwd/home/xiaq/.ssh
[root@localhost ~]# chmod 600 id_rsa 
[root@localhost ~]# ls -l id_rsa-rw------- 1 xiaq xiaq 1679 Apr  1 20:39 id_rsa

类似地,确认远程机器上的 ~/.ssh/authorized_keys 只有你有 rw 权限:

[root@localhost ~]# pwd/home/xiaq/.ssh% chmod 600 authorized_keys 
[root@localhost ~]# ls -l authorized_keys 
-rw------- 1 xiaq xiaq 394 2011-04-18 13:40 authorized_keys

4. 结束


一切顺利的话,你现在就可以不打密码直接 ssh 了。

不过,如果你在生成 SSH 密钥对时,为了更安全设置了 passphrase 了的话,ssh 登录时会请你输入 passphrase。为了不用每次都输,可以用 ssh-agent 和 ssh-add,在 X会话或登录session时 ssh-agent 作为 daemon 启动,它存储私钥用于公钥认证,其他程序作为 ssh-agent 的客户就可以在该会话中实现自动认证。Debian, Fedora 上 ssh-agent 已经被自动启动。

使用 ssh-add 添加私钥:

ssh-add id_rsa_file

不带文件参数时,会添加 $HOME/.ssh/id_rsa, $HOME/.ssh/id_dsa 和 $HOME/.ssh/identity。 ssh-add 时需要输入一次 passphrase。之后在同一次会话中的 ssh 远程登录都不再需要输入。

5. 公钥加密原理


公钥加密 (public-key cryptography),或非对称密钥加密 (asymmetric key cryptography) 是一类广泛使用的加密算法。这类算法使用一对密钥即公钥 (public key) 和私钥 (private key)。其中公钥可以随便分发,只用于加密 (encryption),私钥则只由一人持有,只用于解密。任何一个信息用公钥加密之后,用私钥解密即可得到原来的信息,反之则不一定。

公钥加密的关键点在于,一方面,公钥加密是可逆的,但是不能用公钥推断出私钥。显然数学上,已知一个公钥是能够算出对应私钥的,但是只要设计足够好的加密算法(以及使用足够复杂的密钥对),使得不能在可以接受的时间内破译即可。

RSA 是一种常见的公钥加密算法。RSA 的工作原理依赖于如下事实:破译 RSA 私钥需要对某些极大的整数进行因数分解,而目前尚未找到快速的对极大整数作因数分解的算法。换言之,如果有人找到了这样的算法,那么全世界的 RSA 加密都会失效。

RSA是由Ron Rivest, Adi Shamir, Leonard Adleman三人在1978年首次提出的。三人并因此项工作荣获了2002年Turing Award。周时,Rivest还是算法导论的作者之一,书中在31章对RSA系统的原理进行了简要说明,系统实现中利用到了数论中的Euler-Fermat theorem

COMMENT: 但不管怎么,极大整数的因数分解还是可能的。RSA_Laboratories举办过多次悬赏破译 RSA 的活动,更多信息可以看看 RSA_Secret-Key_Challenge

尽管随着密码学的发展,RSA 的安全性已经越来越受到威胁,但是未来能诞生可以在多项式时间内破译 RSA 的可能性还是非常小的。也就是说,除了军方、金融等高危目标之外,RSA 还是适用的。



本文转载自:https://wiki.tuna.tsinghua.edu.cn/SshKeyHowto

共有 人打赏支持
小木头的冬天
粉丝 12
博文 58
码字总数 26102
作品 0
长沙
高级程序员
理解OpenSSH的RSA和DSA认证过程

OpenSSH 的 RSA 和 DSA 认证协议的基础是一对专门生成的密钥,分别叫做 专用密钥和 公用密钥。使用这些基于密钥的认证系统的优势在于:在许多情况下,有可能不必手工输入密码就能建立起安全的...

LionelShen
2015/03/02
0
0
OpenSSH dropbear

SSL/TLS: SSL:安全的套接字层;1.0 2.0 3.0 TLS:传输层安全;1.0 1.1 1.2 1.3 SSL会话过程四个阶段: SSL Handshake Protocol: 第一阶段:ClientHello 1.协商所支持的协议的版本,如tls...

杨铄
06/26
0
0
SSH HTTPS 公钥、秘钥、对称加密、非对称加密、 总结理解

作者:shede333 主页:http://my.oschina.net/shede333 && http://blog.sina.com.cn/u/1509658847 版权声明:原创文章,版权声明:自由转载-非商用-非衍生-保持署名 [Creative Commons BY-N...

shede333
2014/12/22
0
4
Azure中创建安全Linux 虚机

由于密码易受到强力破解***,特别是在面向 Internet 的 VM(如 Web 服务器)上。连接到 Azure 中的 Linux 虚拟机 (VM) 时,应使用公钥加密提供更安全的方式登录到 Linux VM。 此过程涉及使用...

huangbowen2005
06/26
0
0
PuTTY使用密钥登录到Linux

在Windows管理Linux服务器时,常使用putty登陆ssh进行远程管理。默认登陆验证方式为密码认证,该方式虽然简单,但每次登陆都要输入一长串的密码,相当麻烦。而且,如果万一把root允许登陆打开...

Surjur
2015/03/23
0
0
使用SecureCRT设置linux系统登录的ssh公钥认证

linux系统环境:CentOS release 5.5 1.修改ssh配置文件/etc/ssh/sshdconfig RSAAuthentication yes //使用RSA加密算法 PubkeyAuthentication yes //使用公钥认证 AuthorizedKeysFile .ssh/au......

龙上
2012/11/29
0
0
配置多个git远程仓库的ssh-Key切换

目前的git仓库如github都是通过使用SSH与客户端连接,如果只是固定使用单个git仓库的单个用户(first),生成生成密钥对后,将公钥保存至github,每次连接时SSH客户端发送本地私钥(默认~/....

渺小的尘埃
2015/07/31
0
0
[原创] 使ssh不用输入密码(转)

有些时候,我们在复制/移动文件到另一台机器时会用到scp,因为它比较安全。但如果每次 都要输入密码,就比较烦了,尤其是在script里。不过,ssh有另一种用密钥对来验证的方 式。下面写出我生...

jccpp
2013/07/09
0
0
Git的.ssh文件夹内容介绍

文章作者:Tyan 博客:noahsnail.com | CSDN | 简书 1. rsa与rsa.pub 首先是rsa与rsa.pub是如何产生的,产生的命令如下: 解释:是产生密钥,密钥有两种类型rsa和dsa两种,用来指定密钥类型,...

Quincuntial
2016/10/23
0
0
Hadoop集群(第4期)_SecureCRT使用

1、SecureCRT简介   SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,同时支持Telnet和rlogin协议。SecureCRT是一款用于连接运行包括Windows、UNIX和VMS的远程系统的理想工具。通过使...

Carl_
2015/06/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

32.filter表案例 nat表应用 (iptables)

10.15 iptables filter表案例 10.16/10.17/10.18 iptables nat表应用 10.15 iptables filter表案例: ~1. 写一个具体的iptables小案例,需求是把80端口、22端口、21 端口放行。但是,22端口我...

王鑫linux
今天
0
0
shell中的函数&shell中的数组&告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析

影夜Linux
今天
0
0
Linux网络基础、Linux防火墙

Linux网络基础 ip addr 命令 :查看网口信息 ifconfig命令:查看网口信息,要比ip addr更明了一些 centos 7默认没安装ifconfig命令,可以使用yum install -y net-tools命令来安装。 ifconfig...

李超小牛子
今天
1
0
[机器学习]回归--Decision Tree Regression

CART决策树又称分类回归树,当数据集的因变量为连续性数值时,该树算法就是一个回归树,可以用叶节点观察的均值作为预测值;当数据集的因变量为离散型数值时,该树算法就是一个分类树,可以很...

wangxuwei
昨天
1
0
Redis做分布式无锁CAS的问题

因为Redis本身是单线程的,具备原子性,所以可以用来做分布式无锁的操作,但会有一点小问题。 public interface OrderService { public String getOrderNo();} public class OrderRe...

算法之名
昨天
9
0
143. Reorder List - LeetCode

Question 143. Reorder List Solution 题目大意:给一个链表,将这个列表分成前后两部分,后半部分反转,再将这两分链表的节点交替连接成一个新的链表 思路 :先将链表分成前后两部分,将后部...

yysue
昨天
1
0
数据结构与算法1

第一个代码,描述一个被称为BankAccount的类,该类模拟了银行中的账户操作。程序建立了一个开户金额,显示金额,存款,取款并显示余额。 主要的知识点联系为类的含义,构造函数,公有和私有。...

沉迷于编程的小菜菜
昨天
1
0
从为什么别的队伍总比你的快说起

在机场候检排队的时候,大多数情况下,别的队伍都要比自己所在的队伍快,并常常懊悔当初怎么没去那个队。 其实,最快的队伍只能有一个,而排队之前并不知道那个队快。所以,如果有六个队伍你...

我是菜鸟我骄傲
昨天
1
0
分布式事务常见的解决方案

随着互联网的发展,越来越多的多服务相互之间的调用,这时候就产生了一个问题,在单项目情况下很容易实现的事务控制(通过数据库的acid控制),变得不那么容易。 这时候就产生了多种方案: ...

小海bug
昨天
3
0
python从零学——scrapy初体验

python从零学——scrapy初体验 近日因为一些事情,需要从网上爬取一些东西,故而想通过使用爬虫来顺便学习下强大的python。现将一些学习中遇到的问题记录下来,以便日后查询 1. 开发环境的准...

咾咔叽
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部