![方法 1. 带密码的公钥](https://linux22.com/image/1006670/%E6%96%B9%E6%B3%95%201.%20%E5%B8%A6%E5%AF%86%E7%A0%81%E7%9A%84%E5%85%AC%E9%92%A5.png)
我的问题是:我成功地从系统开发了基于 RSA 密钥的 ssh 登录板。当客户端首次登录时,也会询问私钥和密码,这也可以正常工作。第二次登录时,ssh 不会询问私钥或密码,直接登录板。
客户端使用Ubuntu 16.04并板载定制的Ubuntu。
首次登录使用以下命令:
ssh -i ~/.ssh/id_rsa user@board_ip
//工作正常
第二次:
ssh user@board_ip
//永远不要询问密码和公钥 -问题
第一次:
ssh user@board_ip
//没有密钥就无法登录 - 工作正常
据我了解,我在主板上的 sshd_config 文件中犯了一个错误。我尝试了以下设置,但总是失败。
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
#PasswordAuthentication yes
PermitEmptyPasswords no
项目要求是安全登录,主要在 ssh 上。为了实现更安全的基于 SSH 密码的登录,我们转向基于密钥的登录。如上所述,更改所有配置后。SSH 登录也需要私钥和密码。注销后,过一段时间再次登录,ssh 不需要密钥或密码,项目要求每次都需要密钥和密码。
答案1
有两种方法可以配置ssh
为同时需要公钥和密码或密码短语。
密码与口令的区别:
此处的密码是分配给服务器计算机(董事会)中用户的密码。如果董事会只有一个用户帐户,则只有一个密码。如果董事会有多个用户帐户,则每个帐户应有各自的密码。
密码与客户端(本地)计算机中的私钥相关联,而不是与远程服务器(主板)计算机相关联。因此,如果您使用两台不同的设备客户端计算机进行 ssh,则必须为存储在每台本地计算机中的私钥创建密码。同样,如果两个不同的用户需要从各自的本地计算机 ssh 到服务器(主板),他们将需要自己的私钥-公钥对和自己的密码来解锁各自的私钥。
例如,假设你和我需要从我们自己的笔记本电脑 ssh 到同一台服务器计算机(主板)。你将拥有自己的私钥和该私钥的密码。我将拥有自己的私钥及其密码。这种安排的结果是,我可以随时更改私钥的密码,而无需告诉你,也无需更改服务器计算机(主板)的任何内容。我甚至可以从私钥中删除密码,而无需告诉你。
另一种情况是,如果我有多个服务器需要 ssh 连接,并且我使用相同的私钥向所有服务器验证自己的身份,则我需要使用相同的密码来访问我使用的所有服务器中的 ssh,而不仅仅是您的主板。
方法 1. 带密码的公钥
参考:https://help.ubuntu.com/community/SSH/OpenSSH/Keys
步骤 1. 为每个客户端和用户组合向现有的公钥-私钥添加密码
对于每台客户端计算机或设备上的每个用户,使用以下命令为现有的公钥-私钥对生成密码:
ssh-keygen -p
系统将提示您输入保存文件的位置。按回车键接受默认位置。
如果您已经设置了密码,系统会要求您输入现有密码。在这种情况下,您已经完成此步骤。按Ctrl+C停止该过程。
接下来系统将提示您输入新密码。不要按 Enter 键!输入一个长且难猜且容易记住的密码。系统将要求您重新输入密码。
如果您没有现有的公钥-私钥对,请使用以下命令生成它。如果需要,系统将提示您添加密码:
ssh-keygen -t rsa
每次尝试登录 ssh 服务器时,系统都会要求您输入此密码。此密码可能与 ssh 服务器的用户密码不同。每个用户可以拥有自己的密码。如果用户需要从不同的客户端(笔记本电脑、手机等)登录,她将需要为每个客户端重复此过程。她可以为不同的客户端选择不同的密码。
第 2 步:仅当密钥是新的时才将公钥复制到服务器
在您的客户端计算机中输入:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@board_ip
它将询问远程服务器中的用户的密码。请记住,必须启用基于密码的登录才能正常工作。
对所有用户和所有客户端设备重复此操作。
步骤 3. 测试是否有效
尝试通过输入以下内容登录服务器:
ssh user@board_ip
如果一切顺利,系统将提示您输入在步骤 2 中创建的密码。这不是您在步骤 3 中被要求输入的用户密码。
如果您看到提示输入用户密码,则表明有些不对劲。 在您完成这项工作之前,请不要继续下一步。
步骤 4. 禁用基于密码的登录
一旦每个用户及其各自的客户端设备都有自己的公钥-私钥对和各自选择的密码,您就不再需要基于密码的登录。最好禁用此方法。保持启用状态将允许任何没有公钥-私钥对的人尝试猜测 user@board-ip 的密码。
在ssh服务器的board里,编辑文件/etc/ssh/sshd_config
,并更改:
#PasswordAuthentication yes
读书:
PasswordAuthentication no
请注意,#
第二行中没有 ,而yes
现在是no
。
通过以下方式重新启动服务器中的 ssh 服务:
sudo service ssh restart
如果此方法无效,请重新启动主板。
已完成。密码短语可能由 Gnome-Keyring 缓存在客户端中,直到用户退出本地计算机。因此,每个会话仅询问一次密码短语。
接下来是另一种选择。您需要执行 1 或 2。
方法 2. 需要公钥和用户密码
步骤 1. 针对每个客户端和用户组合,从私钥中删除密码(如果存在)
对于每台客户端计算机或设备上的每个用户,使用以下命令删除每个公私密钥对的现有密码:
ssh-keygen -p
系统将提示您输入保存文件的位置。按回车键接受默认位置。
如果您有现有密码,系统会要求您输入。如果没有提示您输入现有密码,则您已完成。按Ctrl+C停止该过程。
否则,输入现有密码并继续。
接下来系统将提示您输入密码。打Enter两次从私钥中删除现有密码。
如果您没有现有的公钥-私钥对,请使用以下命令生成它。如果需要,系统将提示您添加密码:
ssh-keygen -t rsa
如果用户需要从不同的客户端(笔记本电脑、手机等)登录,她将需要为每个客户端重复此过程。
第 2 步:仅当密钥是新的时才将公钥复制到服务器
在您的客户端计算机中输入:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@board_ip
它将询问远程服务器中的用户的密码。请记住,必须启用基于密码的登录才能正常工作。
对所有用户和所有客户端设备重复此操作。
步骤 3. 测试是否正在使用公钥
尝试通过输入以下内容登录服务器:
ssh user@board_ip
如果一切顺利,系统不会提示您输入任何密码或密码短语。 这是正常的。这说明公钥已正确安装在 ssh 服务器(主板)中并且正在工作。我们将更改设置,以便它在下一步中再次要求输入密码。
步骤 4. 设置公钥和密码
登录 ssh 服务器(主板)并编辑文件/etc/ssh/sshd_config
。在文件中添加以下行:
AuthenticationMethods "publickey,password"
警告:确保看起来PasswordAuthentication
像:
#PasswordAuthentication yes
这是默认行为。您可以选择#
在开始时保留或删除。但是,如果将此设置no
与您刚刚添加的行一起设置为,则没有人能够使用登录到服务器ssh
。如果您被锁定,您将必须亲自前往远程服务器,将其连接到键盘、显示器等,然后在本地登录并编辑此文件以解决问题。
结束警告
通过以下方式重新启动服务器中的 ssh 服务:
sudo service ssh restart
如果此方法无效,请重新启动主板。
第 5 步:测试磨合
找到一台新计算机或使用新用户名(例如 user2)登录到客户端计算机。此用户/home/$USER/.ssh/
的文件夹中不应有任何公钥-私钥对。我们将假装 user2 是黑客,他以某种方式找到了 user@board_ip 的密码,并尝试通过 ssh 进入该系统。
以 user2 身份从客户端计算机输入:
ssh user@board_ip
如果您仅使用密码即可登录,则此方法无效。任何知道密码或能猜出密码的人都可以登录到论坛。他们不需要密钥。
如果得到一个permission denied
并且登录失败,则公钥和密码的双重认证有效。
希望这可以帮助
答案2
问题是这是 Ubuntu 中 SSH 公钥的默认位置。因此,在密钥交换完成后,~/.ssh/id_rsa
您无需在 SSH 命令中包含密钥对即可使用。-i ~/.ssh/id_rsa
id_rsa
为了避免这种行为,请使用不同的名称创建 SSH 密钥对,然后仅当您使用选项指定它时才会使用它-i
。
例子:user_ssh_rsa
如果您在用户主目录中 创建名称为该名称的密钥:
ssh-keygen -t rsa -f ~/.ssh/user_ssh_rsa
然后与远程服务器交换密钥,并在提示时输入远程系统上的用户的密码:
ssh-copy-id -i ~/.ssh/user_ssh_rsa user@board_ip
使用以下方式登录:
ssh -i ~/.ssh/user_ssh_rsa user@board_ip
由于使用新创建的密钥,因此无需输入密码即可登录。
使用:
ssh -user@board_ip
由于无法自动找到密钥对,因此将提示输入密码。
这确实取决于是否已删除已共享的密钥~/.ssh/id_rsa