Code前端首页关于Code前端联系我们

什么是 SSH 密钥?登录过程和ssh-keygen命令生成密钥

terry 2年前 (2023-09-28) 阅读数 61 #未命名

密钥是什么

密钥(key)是通过加密算法得到的一个非常大的数字。对称加密只需要一个密钥,而非对称加密则需要成对使用两个密钥,分为公钥和私钥。

SSH 密钥登录使用非对称加密,每个用户使用自己的密钥登录。其中,私钥必须保密,不能泄露;公钥是公开的,可以发送给外界。他们的关系是公钥和私钥一一对应。每个私钥都有一个且只有一个对应的公钥,反之亦然。

如果数据使用公钥加密,则只能使用对应的私钥解密,其他密钥不起作用;相反,如果使用私钥来加密数据(通常称为“签名”的过程),则只能使用相应的私钥进行解密。公钥解密。

密钥登录流程

SSH密钥登录分为以下步骤。

准备步骤,客户端使用ssh-keygen生成自己的公钥和私钥。

第一步是手动将客户端的公钥放置在远程服务器上的指定位置。

第二步,客户端向服务器发起SSH登录请求。

第三步,服务器接收用户的SSH登录请求,向用户发送随机数据,要求用户验证身份。

第四步,客户端接收服务器发来的数据,用私钥对数据进行签名,然后发送回服务器。

第五步,服务器收到客户端的加密签名后,使用对应的公钥解密,然后与原始数据进行比较。如果匹配,则用户可以登录。

ssh-keygen 命令:生成密钥

基本用法

密钥 登录时,首先要生成公钥和私钥。 OpenSSH 提供了 ssh-keygen 命令来生成密钥。

直接输入ssh-keygen,程序会提出问题,然后生成密钥。

$ ssh-keygen

通常的做法是使用-t参数指定密钥的加密算法。

$ ssh-keygen -t dsa

在上例中,参数-t用于定义密钥的加密算法。通常选择DSA算法或RSA算法。如果省略该参数,则默认使用RSA算法。

输入上述命令后,ssh-keygen会要求用户回答一些问题。

$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_dsa):  press ENTER
Enter passphrase (empty for no passphrase): ********
Enter same passphrase again: ********
Your identification has been saved in /home/username/.ssh/id_dsa.
Your public key has been saved in /home/username/.ssh/id_dsa.pub.
The key fingerprint is:
14:ba:06:98:a8:98:ad:27:b5:ce:55:85:ec:64:37:19 username@shell.isp.com

在上面的示例中,执行命令ssh-keygen后,会出现第一个问题,询问保存密钥的文件的名称。默认为文件~/.ssh/id_dsa,即私钥的文件名,对应的公钥文件~/.ssh/id_dsa.pub为生成的。用户的密钥通常可以在主目录的 .ssh 目录中找到。

如果选择rsa算法,生成的密钥文件将为:~/.ssh/id_rsa(私钥)和~/sh。默认 。 pub(公钥)。

然后会有第二个问题询问是否要对私钥文件进行密码保护(密码)。在这种情况下,即使入侵者得到了私钥,他仍然必须破解密码。为了方便起见,如果您不想设置密码保护,只需按 Enter 键即可,密码将为空。稍后您需要重新输入密码,并且两次输入的密码必须一致。注意,这里的英文单词“password”是密码。这是为了避免与 Linux 帐户的密码混淆,这意味着它不是用户系统帐户的密码。

最后生成私钥和公钥,并在屏幕上显示公钥指纹,以及当前用户名和主机名作为标识密钥来源的注释。

公钥文件和私钥文件都是文本文件,可以使用文本编辑器查看其内容。公钥文件的内容类似于以下内容。

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAvpB4lUbAaEbh9u6HLig7amsfywD4fqSZq2ikACIUBn3GyRPfeF93l/
weQh702ofXbDydZAKMcDvBJqRhUotQUwqV6HJxqoqPDlPGUUyo8RDIkLUIPRyq
ypZxmK9aCXokFiHoGCXfQ9imUP/w/jfqb9ByDtG97tUJF6nFMP5WzhM= username@shell.isp.com

在上面的示例中,username@shell.isp.com 是对公钥的注释,用于标识不同的公钥并指示它是哪个主机(shell .isp。com 的公钥(用户名)不是必需的。

注意,公钥只有一行。因为太长,所以在上面显示为三行。

以下命令可以列出所有用户的公钥。

$ ls -l ~/.ssh/id_*.pub

生成密钥后,建议更改其权限,以防止其他人读取。

$ chmod 600 ~/.ssh/id_rsa
$ chmod 600 ~/.ssh/id_rsa.pub

配置项

ssh-keygen 命令行配置主要包括以下几项:

(1 )-b

-b该参数决定了密钥的二进制位数,该参数越大,越难破解

一般来说,-b至少应为1024,设置为2048或更高更安全。

(2)-C

-C该参数可以在密钥文件中添加新注释,格式为用户名@主机♽❀。

以下命令为 4096 位 RSA 加密算法创建密钥对,并提供用户名和主机名。

$ ssh-keygen -t rsa -b 4096 -C "your_email@domain.com"

(3) -f

-f参数决定创建的私钥文件。

$ ssh-keygen -t dsa -f mykey

上述命令会在当前目录中创建公钥文件mykeymykey.pub

(4) -F

-F 参数检查文件 known_hosts 中是否存在主机名。

$ ssh-keygen -F example.com

(5)-N

-N该参数用于输入私钥的密码(passphrase)。

$ ssh-keygen -t dsa -N secretword

(6)-p

-p该参数用于重新输入私钥密码(password)。与-N的区别在于,新密码不是在命令中输入,而是在执行后输入。 ssh 首先要求输入旧密码,然后输入新密码两次。参数

(7)-R

-R从文件known_hosts中移动指定公钥的指纹。 † 手动上传公钥

密钥生成后,必须将公钥上传到服务器,才能使用公钥登录。

OpenSSH 要求将用户的公钥存储在服务器 ~/.ssh/authorized_keys 文件中。无论您想以哪个用户身份登录服务器,密钥都必须保存在用户主目录中的文件 ~/.ssh/authorized_keys 中。只要将公钥添加到这个文件中,就相当于将公钥上传到服务器了。每个公钥占据一行。如果该文件不存在,可以手动创建。

用户可以手动编辑该文件并将公钥粘贴到其中,或者在本地计算机上执行以下命令。

$ cat ~/.ssh/id_rsa.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

在上面的示例中,您必须转到要登录的用户名和主机名,而不是user@host

记住文件authorized_keys的权限必须设置为644,即只有文件的所有者才能写入。如果权限设置不正确,SSH服务器可能会拒绝读取该文件。

$ chmod 644 ~/.ssh/authorized_keys

当公钥上传到服务器时,OpenSSH下次会自动使用该密钥登录,不会再次要求输入密码。

$ ssh -l username shell.isp.com
Enter passphrase for key '/home/you/.ssh/id_dsa': ************
Last login: Mon Mar 24 02:17:27 2014 from ex.ample.com
shell.isp.com>

上例中,SSH客户端使用私钥之前,用户必须输入密码(password)来解锁私钥。

ssh-copy-id命令:自动上传公钥

OpenSSH附带一个ssh-copy-id命令,可以自动将公钥复制到远程服务器 /。 ssh/authorized_keys

文件。如果文件 ~/.ssh/authorized_keys 不存在,命令 ssh-copy-id 将自动创建该文件。

用户可以通过执行以下命令将本地公钥复制到本地计算机上的服务器。 † 服务器地址。如果省略用户名,则默认为当前本地用户名。执行命令后,公钥将被复制到服务器。

注意,公钥文件不需要指定.pub的路径和后缀名,ssh-copy-id会自动在/中ssh目录找到它。

$ ssh-copy-id -i id_rsa user@host

在上面的命令中,公钥文件自动设置为~/.ssh/id_rsa.pub。使用密码

ssh-copy-id 进行登录,系统将提示您输入远程服务器密码。

请注意,ssh-copy-id将公钥直接添加到authorized_keys文件的末尾。如果文件末尾authorized_keys不是换行符,则新公钥将附加到前一个公钥的末尾,并且两个公钥会链接。不能占上风。因此,如果 Authorized_Keys 文件已存在,则在使用 SSH-COPY-ID 命令之前,请确保 Authorized_Keys 文件末尾以换行符结尾(假设文件已经存在))。

ssh-agent 命令、ssh-add 命令

基本用法

设置私钥密码后,每次使用时都需要输入密码,有时非常不方便。例如,如果您一直使用scp命令远程复制文件,则每次都必须输入密码。命令

ssh-agent旨在解决这个问题。它允许用户在整个 Bash 会话期间仅在第一次使用 SSH 命令时输入密码,然后将私钥保存在内存中,而无需稍后输入私钥密码。

第一步是使用以下命令创建一个新的命令行对话。

$ ssh-agent bash

上面的命令中,如果您使用的命令行环境不是Bash,则可以使用其他shell命令代替。例如,zshhal

如果您想在当前会话中启用ssh-agent,可以使用以下命令。

$ eval `ssh-agent`

在上面的命令中,ssh-agent会先自动在后台运行,并将要设置的环境变量输出到屏幕上,如下所示。

$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-barrett/ssh-22841-agent; export SSH_AUTH_SOCK;
SSH_AGENT_PID=22842; export SSH_AGENT_PID;
echo Agent pid 22842;

eval命令的作用是运行上述ssh-agent命令的输出并设置环境变量。

第二步是在新的 Shell 会话中使用命令 ssh-add 设置默认私钥(例如 ~/.ssh/id_rsa 或

) ~ /.ssh /id_dsa~/.ssh/id_ecdsa~/.ssh/id_ed25519)。

$ ssh-add
Enter passphrase for /home/you/.ssh/id_dsa: ********
Identity added: /home/you/.ssh/id_dsa (/home/you/.ssh/id_dsa)

上例中,添加私钥时必须输入密码。以后,当您在本次对话中使用密钥时,无需输入私钥密码,因为私钥已加载到内存中。

如果添加的私钥不是默认私钥,则ssh-add命令必须指定私钥文件。

$ ssh-add my-other-key-file

上述命令中,other-keyfile为用户指定的私钥文件。

第三步,使用ssh命令正常登录远程服务器。

$ ssh remoteHost

上面的命令中,remoteHost是远程主机的地址,ssh使用默认私钥。那么,如果私钥有密码,ssh就不再要求密码,而是直接从内存中取出私钥。

如果要使用不同的私钥登录服务器,必须使用ssh命令

参数输入私钥文件。
$ ssh –i OpenSSHPrivateKey remoteHost

最后,如果想退出ssh-agent,可以直接退出子shell(按Ctrl + d)或使用以下命令。使用命令

$ ssh-agent -k

ssh-add

ssh-add,您可以将私钥添加到 ssh-agent♽♝♽❀

它具有以下参数。

(1)-d

-d参数从内存中删除指定的私钥。参数

$ ssh-add -d name-of-key-file

(2)-D

-D 从内存中删除所有添加的私钥。参数

$ ssh-add -D

(3)-l

-l列出了所有添加的私钥。

$ ssh-add -l

关闭密码登录

为了安全起见,启用密钥登录后,最好在服务器上关闭密码登录。对于

OpenSSH,具体方法是打开服务器的sshd配置文件/etc/ssh/sshd_config❙❀❀

PasswordAuthentication no

更改配置文件后记得重启sshd,否则不会生效。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门