代码改变世界

ssh-keygen的学习总结

2018-08-02 23:50  潇湘隐者  阅读(5497)  评论(0编辑  收藏  举报

ssh-keygen介绍

 

维基百科上关于ssh-keygen的介绍如下:

 

    ssh-keygen is a standard component of the Secure Shell (SSH) protocol suite found on Unix and Unix-like computer systems used to establish secure shell sessions between remote computers over insecure networks, through the use of various cryptographic techniques. The ssh-keygen utility is used to generate, manage, and convert authentication keys.

 

    ssh-keygen is able to generate a key using one of three different digital signature algorithms.

With the help of the ssh-keygen tool, a user can create passphrase keys for any of these key types (to provide for unattended operation, the passphrase can be left empty, at increased risk).

These keys differ from keys used by the related tool GNU Privacy Guard.

 

  Oracle Solaris 11.2 Information Library (简体中文)手册中关于ssh-keygen的介绍如下: 

 

ssh-keygen主要用于为ssh(远程登录程序)生成、管理和转换验证密钥。ssh-keygen 可以创建供 SSH 协议版本 1 使用的 RSA 密钥,以及供 SSH 协议版本 2 使用的 RSA DSA 密钥。生成的密钥类型使用t选项指定。ssh-keygen 还可以生成指纹或从指定为 PKCS#11 URI X.509v3 证书转换公钥。

 

通常,希望将 SSH RSA DSA 验证结合使用的每个用户应运行一次此实用程序,以便在 $HOME/.ssh/identity$HOME/.ssh/id_dsa  $HOME/.ssh/id_rsa 中创建验证密钥。系统管理员还可以使用此实用程序生成主机密钥。

 

通常,此程序会生成密钥并要求提供一个存储私钥的文件。公钥存储在附加了 ".pub" 扩展名的同名文件中。该程序还要求提供口令短语。口令短语可以为空,表示没有口令短语(主机密钥必须具有空口令短语),也可以为任意长度的字符串。好的口令短语长度在 10-30 个字符,不是简单的句子或其他容易猜到的句子,由大写字母、小写字母、数字和非字母数字字符组合而成。(普通英文句子中的每个字只有 1-2 位的熵,提供的口令短语非常差。)如果设置口令短语,则长度必须至少为 4 个字符,后面可以使用p选项更改口令短语。

 

无法恢复丢失的口令短语。如果丢失或忘记口令短语,您必须生成一个新密钥并将相应的公钥复制到其他计算机。

 

对于 RSA,密钥文件中还包含一个注释字段,该字段只是为了便于用户识别密钥。comment 字段可以说明密钥的用途或提供任何有用信息。创建密钥时,注释将初始化为 "user@host",但可以使用c 选项进行更改。

 

密钥生成后,可以使用下面的详细说明了解应将密钥放在何处,以便激活密钥。

 

当我们需要跨服务器实现免密码自动登陆,因此我们首先需要使用ssh-keygen生成登陆密钥。生成登陆密钥需要三个步骤,在本地机器创建密钥,复制公钥到远程主机,将公钥追加到远程主机的authorized_keys

 

 

 

 

1: 生成钥文件和私钥文件

 

 

ssh-keygen它支持RSA和DSA两种认证密钥,下面是的一些注意参数(可以使用 ssh-keygen /? 看看参数信息):

 

 

–b bits
 
指定要创建的密钥的位数。最小位数为 512 位。通常,2048 位足以满足安全需要。密钥大小超过该值并不会提高安全性,反而会降低速度。缺省值为 2048 位。
 
–B
显示指定的私钥或公钥文件的 bubblebabble 摘要。
 
–c
请求更改私钥和公钥文件中的注释。该程序会提示您提供包含私钥的文件、口令短语(如果密钥具有一个口令短语)以及新的注释。
此选项仅适用于 rsa1 (SSHv1) 密钥。
 
–C comment
提供新注释。
 
 
–e
 
此选项读取 OpenSSH 私钥或公钥文件并将密钥以 "SECSH" 公钥文件格式输出到 stdout。此选项允许导出密钥供其他一些 SSH 实现使用。
–f
 
指定密钥文件的文件名。
–F
 
在known_hosts 文件中搜索指定的 hostname,列出找到的任何匹配项。此选项可用于查找散列格式的主机名或地址,还可以与 –H 选项一起使用,以散列格式输出找到的密钥。
 
–H
 
对 known_hosts 文件执行散列计算。此选项使用散列形式替换指定文件内的所有主机名和地址。原始内容将移动到后缀为 .old 的文件中。这些散列值通常由 ssh 和 sshd 使用,即使文件内容被公开,这些散列值也并不会透露可识别的信息。此选项不会修改现有的散列主机名,因此可以放心地用于同时包含散列名称和非散列名称的文件。
 
–i
 
此选项以 SSH2 兼容格式读取未加密的私钥(或公钥)文件并将 OpenSSH 兼容的私钥(或公钥)输出到 stdout。ssh-keygen 还可读取 “SECSH” 公钥文件格式。此选项允许从其他一些 SSH 实现中导入密钥。
 
–l
 
显示指定的私钥或公钥文件的指纹。
 
–N new_passphrase
 
提供新口令短语。
 
–p
请求更改私钥文件的口令短语,而不创建新私钥。该程序会提示您提供包含私钥的文件、旧口令短语,并两次提示您输入新口令短语。
 
–P passphrase
提供(旧)口令短语。
 
–q
退出 ssh-keygen。
 
–t type
 
指定用于生成密钥的算法,其中 type 是 rsa、dsa 和 rsa1 中的一种。rsa1 类型仅用于 SSHv1 协议。
 
–R hostname
从 known_hosts 文件中删除属于 hostname 的所有密钥。此选项可用于删除散列主机。请参见 –H。
 
–x
已过时。已被 –e 选项取代。
 
–X
已过时。已被 –i 选项取代。
 
–y
此选项读取 OpenSSH 私钥格式文件并将 OpenSSH 公钥输出到 stdout。

 

 

判断.ssh目录是否存在,不存在则创建目录并赋予权限。目录存在即可跳过

 

 

.ssh目录存在

 

$ ls -la ~/.ssh
total 12
drwx------  2 oracle oinstall 4096 May 20  2015 .
drwx------ 22 oracle oinstall 4096 Jul  3 13:36 ..
-rw-r--r--  1 oracle oinstall 1579 Dec  7  2017 known_hosts

 

.ssh目录不存在

 

$ ls -la ~/.ssh
ls: /home/oracle/.ssh: No such file or directory
$mkdir ~/.ssh 
$chmod 700 ~/.ssh

 

测试发现,其实执行下面命令生成ssh 密钥后,会在当前用户的主目录下创建.ssh目录。因此,上述步骤其实完全可以忽略

 

 

[oracle@mylnx01 ~]$ ssh-keygen -t rsa
 
Generating public/private rsa key pair.
 
Enter file in which to save the key (/home/oracle/.ssh/id_rsa): 
 
Enter passphrase (empty for no passphrase): 
 
Enter same passphrase again: 
 
Your identification has been saved in /home/oracle/.ssh/id_rsa.
 
Your public key has been saved in /home/oracle/.ssh/id_rsa.pub.
 
The key fingerprint is:
 
ae:cb:6a:9c:60:72:bc:2c:27:dc:1f:06:e6:c8:1d:0c oracle@mylnx01.xxx.com

 

上述可以按ENTER键后空格键跳过(口令短语可以为空),生成ssh 密钥后,可以到~/.ssh目录下查看相关文件,一般来说ssh 密钥会包含id_rsaid_rsa.pub两个文件,分别表示生成的私钥和公钥。

 

 

 

 

2: 复制公钥到远程目标服务器

 

 

#复制公钥到远程服务器,例如,此处为服务器192.168.xxx.xxx

 

[oracle@mylnx01 ~]$ scp ~/.ssh/id_rsa.pub 192.168.xxx.xxx:~/.ssh 
 
oracle@192.168.xxx.xxx's password: 
 
id_rsa.pub     

 

在复制密钥前,应该先去远程服务器(此处为mylnx02)执行下面操作。

 

 

正确的操作步骤:

 

1:验证目录是否存在

 

[oracle@mylnx02 ~]$  ls -la ~/.ssh

ls: /home/oracle/.ssh: No such file or directory

 

2: 创建.ssh目录(如果目录已经存在可以忽略后续步骤)

 

[oracle@mylnx02 ~]$ mkdir ~/.ssh

 

3:  设置目录权限

 

[oracle@mylnx02 ~]$ chmod 700 ~/.ssh

 

4: 创建空文件authorized_keys

 

[oracle@mylnx02 ~]$ touch ~/.ssh/authorized_keys

 

5:  给文件authorized_keys授权

 

[oracle@mylnx02 ~]$ chmod 600 ~/.ssh/authorized_keys

 

6:  验证上述操作

 

[oracle@mylnx02 ~]$ ls -la ~/.ssh
total 8
drwx------  2 oracle oinstall 4096 Aug  1 07:20 .
drwx------ 11 oracle oinstall 4096 Aug  1 07:20 ..
-rw-------  1 oracle oinstall    0 Aug  1 07:20 authorized_keys

 

 

 

3:追加公钥到远程主机的authorized_keys

 

[oracle@mylnx02 ~]$  cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys

 

 

注意事项:没有检查目标服务器是否存在.ssh目录(没有第二步骤检查路径,直接copy了文件),使用scp ~/.ssh/id_rsa.pub  192.168.xxx.xxx:~/.ssh 后,执行下面命令将会遇到下面错误

 

[oracle@mylnx02 ~]$  cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys
 
-bash: /home/oracle/.ssh/authorized_keys: Not a directory
 
 
 
[oracle@mylnx02 ~]$ ls -la ~/.ssh
 
-rw-r--r-- 1 oracle oinstall 411 Aug  1 11:18 /home/oracle/.ssh

 

如果遇到上述错误,应该删除rm -rf ~/.ssh ,然后按照上述步骤操作,即可解决问题。

 

 

 

 

4: 测试验证结果

 

[oracle@mylnx02 ~]$ ssh 192.168.7.xxx  free -m
             total       used       free     shared    buffers     cached
Mem:         32237      32072        165          0        137      11493
-/+ buffers/cache:      20441      11796
Swap:        12287          0      12287
[oracle@mylnx02 ~]$ ssh 192.168.7.222  date
Thu Aug  2 23:47:07 CST 2018

 

 

参考资料:

https://docs.oracle.com/cd/E56344_01/html/E54075/ssh-keygen-1.html

https://en.wikipedia.org/wiki/Ssh-keygen