使用 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. python生成随机二进制文件

    import random def genFile(filename,block=1,size=1): f=open(filename,"wb") content="&q ...

  2. Warning: Invalid argument supplied for foreach()

    经常对提交过来的数据进行双重循环,但是为空时会报错:Warning: Invalid argument supplied for foreach() 如下解决即可:foreach($data[$i]  ...

  3. uoj164. 【清华集训2015】V 统计

    坑爹题面:http://uoj.ac/problem/164 正常题面: 对于一个序列支持下列5个操作: 1.区间加x 2.区间减x并与0取max 3.区间覆盖 4.单点查询 5.单点历史最大值查询 ...

  4. iOS:导航栏的工具条和导航条

    功能:用NAV视图控制器打开新的视图,默认工具条和导航条隐藏,双击显示之 // // main.m // Hello // // Created by lishujun on 14-8-28. // ...

  5. Codeforces Round #313 (Div. 2)

    大半年没有打Codeforces , 昨天开始恢复打Codeforces, 简直是, 欲语泪先流啊. 手残到爆的写错了范围, 手残的数漏了条件, 简直不能直视, 最坑爹的是, E题没时间写代码了. 题 ...

  6. python 学习笔记整理

    首先自我批评一下,说好的一天写一篇博客,结果不到两天,就没有坚持了,发现自己做什么事情都没有毅力啊!不能持之以恒.但是,这次一定要从写博客开始来改掉自己的一个坏习惯. 可是写博客又该写点什么呢? 反正 ...

  7. 玩转C++运算符重载

    运算符重载语法:返回值类型  operator运算符(参数列表) {  代码逻辑... } C++中的运算符重载是通过函数来实现的,可以将重载的运算符看作是类成的一个成员函数,向普通函数一样调用.如重 ...

  8. Samara SAU ACM ICPC 2013-2014 Quarterfinal Qualification Contest

    A: 简单题,因为题目中说了不会有数据相同: #include<cstdio> #include<algorithm> #define maxn 200005 using na ...

  9. Codeforces Round #206 (Div. 2)

    只会做三个题: A:简单题,不解释: #include<cstdio> using namespace std; int k,d; int main() { scanf("%d% ...

  10. mysql视图的作用(详细)

    测试表:user有id,name,age,sex字段 测试表:goods有id,name,price字段 测试表:ug有id,userid,goodsid字段 视图的作用实在是太强大了,以下是我体验过 ...