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

使用 RSA 密钥对验证 SSH 的优点是 1) 不用打密码 2) 比密码验证更安全;缺点是 1) 第一次配置的时候有点麻烦 2) 私钥需要小心保存。Anyway 用密钥验证比密码验证还是方便不少的。推荐所有用户使用密钥认证。

1. 生成密钥对

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

% 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@blackie
The 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:

% scp ~/.ssh/id_rsa.pub user@host:
% ssh user@host
% cat id_rsa.pub >> ~/.ssh/authorized_keys

或者等价地

% cat ~/.ssh/id_rsa.pub | ssh user@host 'cat >> ~/.ssh/authorized_keys'

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

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

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

$ 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 权限,其他人没有任何权限:

% pwd
/home/xiaq
% chmod 700 .ssh
% ls -dl .ssh
drwx------ 2 xiaq xiaq 4096 Jun 6 11:29 .ssh/

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

% pwd
/home/xiaq/.ssh
% chmod 600 id_rsa
% ls -l id_rsa
-rw------- 1 xiaq xiaq 1679 Apr 1 20:39 id_rsa

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

% pwd
/home/xiaq/.ssh
% chmod 600 authorized_keys
% ls -l authorized_keys
-rw------- 1 xiaq xiaq 394 2011-04-18 13:40 authorized_keys

4. Over~

一切顺利的话,你现在就可以不打密码直接 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 还是适用的。

5.1. 进一步阅读

公钥加密

Public-key_cryptography

[转] SSH 密钥认证机制的更多相关文章

  1. 使用密钥认证机制远程登录Linux

    密钥认证机制 创建存放key的文件 1)创建目录 /root/.ssh 并设置权限 [root@localhost ~]# mkdir /root/.ssh mkdir 命令用来创建目录,以后会详细介 ...

  2. Linux之SSH密钥认证

    1.SSH协议的认识 SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层基础上的安全协议.SSH 是目前 ...

  3. 转载 :配置ssh密钥认证自动登录

    原文地址 :https://segmentfault.com/a/1190000000481249 在客户端来看,SSH提供两种级别的安全验证.[摘自wikipedia] 第一种级别(基于密码的安全验 ...

  4. Mac OS X下配置远程Linux 服务器SSH密钥认证自动登录

    1. 在本地机器创建公钥 打开万能的终端,执行如下命令,无视一切输出,一路欢快地回车即可. ssh-keygen -t rsa -C 'your email@domain.com' -t 指定密钥类型 ...

  5. SSH 密钥认证

    目录 SSH协议概述 SSH 和 Telnet 的区别 SSH 相关命令 SSH 验证方式 基于密钥的安全认证 SSH 优化 expect 脚本免交互登录 sshpass 免交互登录 SSH协议概述 ...

  6. Mac下配置远程Linux 服务器SSH密钥认证自动登录

    1. 在本地机器创建公钥 打开万能的终端,执行如下命令,无视一切输出,一路欢快地回车即可. ssh-keygen -t rsa -C 'your email@domain.com' -t 指定密钥类型 ...

  7. SSH密钥认证添加方法和一些实用配置

    更改SSH端口号 用账号密码进入主机 sudo nano /etc/ssh/sshd-config 再其中添加Port 22等或改变该条 添加公钥到主机 cd ~ sudo mkdir .ssh 此处 ...

  8. linux ssh密钥认证, 免密码登陆

    1. 客户端生成密钥 # mkdir ~/.ssh # chmod ~/.ssh # cd ~/.ssh 生成RSA密钥 # ssh-keygen -t rsa (然后连续三次回车) 2. 把公钥传到 ...

  9. ssh密钥认证排错

    sshd配置文件没问题: 目录权限设置也没问题: 但是 ssh -vvv 提示: debug3: no such identity: /Users/user/.ssh/id_rsa,/Users/us ...

随机推荐

  1. javascript 与 java

  2. VS2012编译生成XP可以执行的程序

    首先需要的就是下载VS2012的Update 4更新包,然后打开项目的属性页,在 配置属性->平台工具集 选项中选择 Visual Studio 2012 - Windows XP (v110_ ...

  3. Uva_10253 Series-Parallel Networks

    题目链接 题目大意: 1:一条单独的边是串并联网络 2:G1,G2为串并联网络, 将它们的源点与汇点分别连接起来, 得到的也是串并联网络(并联) 3:G1,G2为串并联网络, 将G1的汇点与G2的源点 ...

  4. sqlserver 学习

    http://www.cnblogs.com/CareySon/category/411344.html SQL Server查找的最小单位实际上是页.也就是说即使你只查找一行很小的数据,SQL Se ...

  5. ajax post data 获取不到数据,注意 content-type的设置

    ajax post  data  获取不到数据,注意 content-type的设置 .post/get关于 jQuery data 传递数据.网上各种获取不到数据,乱码之类的.好吧今天我也遇到了,网 ...

  6. Java接口修饰符详解

    接口就是提供一种统一的”协议”,而接口中的属性也属于“协议”中的成员.它们是公共的,静态的,最终的常量.相当于全局常量.抽象类是不“完全”的类,相当于是接口和具体类的一个中间层.即满足接口的抽象,也满 ...

  7. SQLite: sqlite_master

    SQLite数据库中一个特殊的名叫 SQLITE_MASTER 上执行一个SELECT查询以获得所有表的索引.每一个 SQLite 数据库都有一个叫 SQLITE_MASTER 的表, 它定义数据库的 ...

  8. C++ Prime:decltype类型指示符

    decltype作用是选择并返回操作数的数据类型. decltype(f()) sum = x; // sum的类型就是函数f的返回类型 如果decltype使用的表达式是一个变量,则decltype ...

  9. bzoj1912

    由于k只有2,所以我们分类讨论显然当k=1时,我们只要连一条最长的路径即可就是树的直径L少走了L-1条边如果k=2时,我们再次连边成环后如果成环路径与上一次的最长路径没有相同的边,那少走的边数是路径长 ...

  10. Linux Shell编程(16)——循环

    循环就是重复一些命令的代码块,如果条件不满足就退出循环. for loops for arg in [list] 这是一个基本的循环结构.它与C的for结构有很大不同. for arg in [lis ...