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”,这是用来加密私钥的密码。若是你不知道怎么用,直接用空密码也行(固然,这样会下降安全性)。按两次回车后密钥对就生成好了:shell
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”后缀。安全
把你的公钥用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
或者等价地session
[root@localhost ~]# cat ~/.ssh/id_rsa.pub | ssh user@host 'cat >> ~/.ssh/authorized_keys'
再或者dom
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
若是你的 ~ 下没有 .ssh 目录,创建之便可。ide
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@]machinespa
为防止你的私钥被恶意用户获取和/或篡改,以及你的公钥信息被恶意用户篡改,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
一切顺利的话,你如今就能够不打密码直接 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 远程登陆都再也不须要输入。
公钥加密 (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 仍是适用的。