第8章:使用公钥进行SSH身份验证
8.1公钥认证--介绍
公钥身份验证是向登录服务器标识您自己而不是键入密码的另一种方法。
它更安全、更灵活,但设置起来更困难。
在传统的密码身份验证中,您需要通过证明您知道正确的密码来证明您就是您所声称的那个人。
证明您知道密码的唯一方法是告诉服务器您认为密码是什么。
这意味着如果服务器被黑客攻击或欺骗(参见2.2节),攻击者可以了解您的密码。
公钥身份验证解决了这个问题。
您生成一个密钥对,其中包括一个公钥(每个人都可以知道)和一个私钥(您对其保密,不向任何人提供)。
私钥能够生成签名。
使用您的私钥创建的签名不能被没有该私钥的任何人伪造;
但是任何拥有您的公钥的人都可以验证特定签名的真实性。
因此,您在自己的计算机上生成密钥对,并将公钥复制到服务器。
然后,当服务器要求您证明您是谁时,PuTTY可以使用您的私钥生成签名。
服务器可以验证该签名(因为它有您的公钥)并允许您登录。
现在,如果服务器被黑客攻击或欺骗,攻击者不会获得您的私钥或密码;
它们只获得一个签名。
签名不能重复使用,所以他们一无所获。
这里有一个问题:如果您的私钥不受保护地存储在您自己的计算机上,那么任何访问该私钥的人都可以像您一样生成签名。
这样他们就能在你的账户下登录你的服务器。
因此,当您的私钥存储在本地机器上时,通常会使用您选择的密码进行加密。
为了生成签名,PuTTY必须解密密钥,因此必须键入密码。
这使得公钥身份验证不如密码身份验证方便:每次登录到服务器时,您都必须输入一个较长的密码,而不是输入一个较短的密码。
对此的一种解决方案是使用身份验证代理,这是一个单独的程序,它持有解密的私钥并根据请求生成签名。
PuTTY的身份验证代理称为Pageant。
当您开始一个Windows会话时,您将启动Pageant并将您的私钥加载到其中(输入一次密码)。
在会话的其余部分,您可以任意次数地启动PuTTY,而Pageant将自动生成签名,而不需要您做任何事情。
当您关闭Windows会话时,Pageant将关闭,而从未将解密的私钥存储在磁盘上。
许多人认为这是安全和方便之间的一个很好的折衷。
详情请参阅第9章。
可用的公钥算法不止一个。
最常见的是RSA和ECDSA,但也有其他的,尤其是DSA(也称为DSS),它是美国联邦数字签名标准。
PuTTY支持的关键类型在8.2.2节中进行了描述。
8.2使用PuTTY key生成器PuTTYgen
PuTTYgen是一个密钥生成器。
它生成用于PuTTY、PSCP和Plink的公钥和私钥对,以及PuTTY身份验证代理Pageant(参见第9章)。PuTTYgen生成RSA、DSA、ECDSA和Ed25519密钥。
当您运行PuTTYgen时,您将看到一个窗口,其中您有两个选择:“生成”,生成一个新的公钥/私钥对,或“加载”,以加载现有的私钥。
8.2.1生成新密钥
这是生成新密钥对的过程的概要。
下面几节将更详细地描述这个过程。
- 首先,您需要选择要生成的键类型,并选择键的强度。
这在8.2.2节和8.2.3节中有更详细的描述。 - 然后按“Generate”按钮,实际生成密钥。
第8.2.4节描述这一步。 - 生成密钥后,选择注释字段(第8.2.6节)和密码(第8.2.7节)。
- 现在可以将私钥保存到磁盘;
按“save private key”键。
(见部分8.2.8)。
您的密钥对现在可以使用了。
您可能还想将公钥复制到服务器上,方法是将其从“用于粘贴到authorized_keys文件的公钥”框中复制出来(参见8.2.10节),或者使用“保存公钥”按钮(参见8.2.9节)。
但是,您不需要立即这样做;
如果您愿意,您可以稍后将私钥加载回PuTTYgen(请参阅8.2.11节),而公钥将可用于再次复制和粘贴。
第8.3节描述了将PuTTY配置为尝试公钥身份验证,并将SSH服务器配置为接受公钥身份验证的典型过程。
8.2.2选择键的类型
在使用PuTTYgen生成密钥对之前,需要选择所需的密钥类型。
PuTTYgen目前支持这些类型的键:
- 用于SSH-1协议的RSA密钥。
- 用于SSH-2协议的RSA密钥。
- 用于与SSH-2协议一起使用的DSA密钥。
- 用于SSH-2协议的ECDSA(椭圆曲线DSA)密钥。
- 用于SSH-2协议的Ed25519密钥(另一种椭圆曲线算法)。
sh -1协议只支持RSA密钥;
如果您将使用SSH-1协议进行连接,您必须选择第一个密钥类型,否则您的密钥将完全无效。
sh -2协议支持多种密钥类型。
PuTTY支持的类型有RSA、DSA、ECDSA和Ed25519。
8.2.3选择密钥的大小(强度)
“位的数目”输入框允许您选择键PuTTYgen将产生的强度。
对于RSA, 2048位对于大多数用途来说已经足够了。
对于ECDSA,只支持256,384和521位。
(ECDSA提供与RSA相同的安全性,但密钥大小较小。)
对于Ed25519,唯一有效的大小是256位。
8.2.4"生成"按钮(Generate)
一旦您选择了您想要的键类型和键的强度,按下“Generate”按钮,PuTTYgen将开始实际生成键的过程。
首先,会出现一个进度条,PuTTYgen会让你移动鼠标来产生随机性。
将鼠标在PuTTYgen窗口的空白区域上旋转,随着PuTTYgen收集到足够的随机性,进度条将逐渐填充。
你不需要以特别富有想象力的方式摇动鼠标(尽管它不会伤害你);
PuTTYgen将收集足够的随机性,仅从鼠标每次在窗口采样其位置时移动的精确距离的细节。
当进度条结束时,PuTTYgen将开始创建密钥。
进度条将重置为开始,并逐渐向上移动,以跟踪密钥生成的进度。
它不会均匀地移动,有时可能会减速到停止;
不幸的是,这是不可避免的,因为密钥生成是一个随机过程,不可能可靠地预测需要多长时间。
当密钥生成完成时,将在窗口中显示一组新的控件来指示这一点。
8.2.5"密钥指纹"框(Key fingerprint)
“密钥指纹”框显示生成密钥的指纹值。
这是从公钥值以密码学方式派生的,因此不需要保密;
它应该比公钥本身更易于管理。
指纹值的目的是加密安全的,即在计算上不可能让某人发明具有相同指纹的第二个密钥,或者找到具有特定指纹的密钥。
因此,一些实用程序,如Pageant密钥列表框(参见9.2.1节)和Unix sh-add实用程序,将列出密钥指纹,而不是整个公钥。
8.2.6为密钥设置注释
如果你有多把钥匙,并且把它们用于不同的目的,你就不需要记忆钥匙指纹来区分它们。
PuTTYgen允许您输入密钥的注释,每当PuTTY或Pageant要求输入密码时,就会显示该注释。
如果没有指定注释格式,默认的注释格式包含键类型和生成日期,例如rsa-key-20011212。
另一种常用的方法是使用您的名称和密钥将用于的计算机的名称,例如simon@simons-pc。
要更改键注释,只需在“键注释”框中键入注释文本,然后保存私钥。
如果您希望稍后更改注释,可以将私钥加载回PuTTYgen,更改注释,然后再次保存它
8.2.7设置密钥密码
“密钥密码”和“确认密码”框允许您为密钥选择密码。
密码将用于加密磁盘上的密钥,因此如果不首先输入密码,就无法使用密钥。
当您保存密钥时,PuTTYgen将检查“密钥密码”和“确认密码”框是否包含完全相同的密码,否则将拒绝保存密钥。
如果您将passphrase字段留空,密钥将未加密保存。
没有充分的理由,你不应该这样做;
如果您这样做了,那么您磁盘上的私钥文件将是攻击者访问任何配置为接受该密钥的机器所需的全部内容。
如果您希望登录时不必每次都输入密码,那么您应该考虑使用Pageant(第9章),以便解密的密钥只保存在内存中,而不是磁盘中。
在特殊情况下,你可能确实需要使用无密码匙;
例如,如果您需要运行需要建立SSH连接的自动化批处理脚本,那么您就不能在那里输入密码。
在这种情况下,我们建议您为每个特定的批处理脚本(或其他任何需要的脚本)生成一个特殊的键,并且在服务器端您应该安排每个键都是受限制的,以便它只能用于特定的目的。
SSH服务器的文档应该解释如何做到这一点(服务器之间可能会有所不同)。
选择一个好的密码是困难的。
正如您不应该使用字典中的单词作为密码(因为攻击者很容易遍历整个字典)一样,您也不应该使用歌曲歌词、引用或其他众所周知的句子作为密码。
DiceWare(www.diceware.com)建议使用至少五个词每个生成的随机滚动5个骰子,这使/ 2 ^ 64可能的密码,可能不是一个糟糕的计划。
如果你想让你的密码在语法上有意义,这大大减少了可能性,因此你应该使用一个更长的密码。
别忘了你的密码。
没有办法恢复它。
8.2.8将私钥保存到磁盘文件中
生成密钥、设置注释字段和密码之后,就可以将私钥保存到磁盘。
按“保存私钥”键。
PuTTYgen会弹出一个对话框,询问在哪里保存文件。
选择一个目录,输入文件名,然后按“Save”。
此文件为PuTTY的本机格式(*.PPK);
您需要告诉PuTTY使用它进行身份验证(参见4.22.8节)或告诉Pageant加载它(参见9.2.2节)。
8.2.9将公钥保存到磁盘文件中
RFC 4716指定在磁盘上存储SSH-2公钥的标准格式。
一些SSH服务器(如ssh.com)需要这种格式的公钥,以便使用相应的私钥接受身份验证。
(其他的,如OpenSSH,使用不同的格式;
见部分8.2.10。)
要以SSH-2标准格式保存公钥,请按PuTTYgen中的“保存公钥”按钮。
PuTTYgen会弹出一个对话框,询问在哪里保存文件。
选择一个目录,输入文件名,然后按“Save”。
然后,您可能希望将公钥文件复制到SSH服务器机器。
生成密钥后,有关配置公钥身份验证的一般说明,请参见第8.3节。
如果您对SSH-1密钥使用此选项,那么PuTTYgen保存的文件将包含与“用于粘贴的公钥”框中显示的文本完全相同的文本。
这是sh -1公钥的唯一现有标准。
8.2.10"用于粘贴到authorized_keys文件中的公钥"
所有SSH-1服务器都要求您的公钥以一行格式提供给它,然后它才接受您的私钥身份验证。
OpenSSH服务器对于SSH-2也需要这个。
“用于粘贴到authorized_keys文件中的公钥”以正确的一行格式提供公钥数据。
通常,您希望使用鼠标选择框的全部内容,按Ctrl+C将其复制到剪贴板,然后将数据粘贴到已经连接到服务器的PuTTY会话中。
生成密钥后,有关配置公钥身份验证的一般说明,请参见第8.3节。
8.2.11重新加载私钥
PuTTYgen允许您将现有的私钥文件加载到内存中。
如果这样做,那么可以在再次保存之前更改密码和注释;
您还可以复制公钥的其他副本。
若要加载现有键,请按“加载”按钮。
PuTTYgen会弹出一个对话框,您可以在其中浏览文件系统并找到您的密钥文件。
一旦您选择了该文件,PuTTYgen将要求您提供一个密码(如果需要的话),然后将以与生成密钥相同的方式显示密钥细节。
如果您使用Load命令来加载外键格式,它将正常工作,但是您将看到一个消息框,警告您所加载的密钥不是PuTTY本机密钥。
有关导入外键格式的信息,请参见第8.2.12节。
8.2.12处理其他格式的私钥
SSH-1客户机使用标准格式在磁盘上存储私钥。
PuTTY也使用这种格式;
因此,如果您使用OpenSSH或ssh.com的客户端生成了SSH-1私钥,则可以将其与PuTTY一起使用,反之亦然。
但是,SSH-2私钥没有标准格式。
OpenSSH和ssh.com的格式不同,PuTTY的格式也不同。
因此,一个客户端生成的密钥不能立即用于另一个客户端。
使用“转换”菜单中的“导入”命令,PuTTYgen可以以OpenSSH和ssh.com的格式加载SSH-2私钥。
一旦加载了这些密钥类型之一,就可以将其保存为PuTTY格式的密钥(*. ppk),以便在PuTTY套件中使用。
这个过程不会更改密码(除非您有意更改它)。
您可能希望在保存密钥之前更改密钥注释,因为OpenSSH的SSH-2密钥格式不包含注释空间,而且ssh.com的默认注释格式冗长。
PuTTYgen还可以导出OpenSSH格式和ssh.com格式的私钥。
为此,请从“转换”菜单中选择“导出”选项之一。
导出密钥的工作原理与保存密钥完全相同(请参见第8.2.8节)——您需要事先输入您的密码,如果您要保存没有密码的密钥,将会收到警告。
OpenSSH有两种选择。
现代OpenSSH实际上有两种用于存储私钥的格式。
“导出OpenSSH密钥”将自动为密钥类型选择支持的最古老的格式,以最大限度地向后兼容OpenSSH的旧版本;
对于像Ed25519这样较新的键类型,它将使用较新的格式,因为这是惟一合法的选项。
如果您有特定的原因想要使用OpenSSH的新格式,甚至RSA、DSA或ECDSA密钥,您可以选择“导出OpenSSH密钥(强制使用新文件格式)”。
注意,由于只有SSH-2密钥有不同的格式,如果您生成了一个SSH-1密钥,那么导出选项是不可用的。
8.3准备公钥身份验证
使用带有SSH协议的PuTTY连接到SSH服务器。
当连接成功时,将提示您输入登录的用户名和密码。
一旦登录,您必须配置服务器接受您的公钥进行身份验证:
- 如果您的服务器使用的是SSH-1协议,那么您应该切换到.ssh目录,并使用您最喜欢的编辑器打开authorized_keys文件。
(如果这是您放入的第一个键,那么您可能必须创建这个文件)。
然后切换到PuTTYgen窗口,选择“Public key for pasting into authorized_keys file”框中的所有文本(参见8.2.10节),并将其复制到剪贴板(Ctrl+C)。
然后,切换回PuTTY窗口,将数据插入打开的文件中,确保所有数据都在一行中。
保存文件。 - 如果您的服务器是OpenSSH,并且使用的是SSH-2协议,那么您应该遵循相同的指令,只是在OpenSSH 2的早期版本中,该文件可能被称为authorized_keys2。
(在现代版本中,SSH-1和SSH-2密钥都使用相同的authorized_keys文件。) - 如果您的服务器是ssh.com的产品,并且使用的是SSH-2,那么您需要从PuTTYgen保存一个公钥文件(参见8.2.9节),并将其复制到服务器上的.ssh2目录中。
然后您应该进入.ssh2目录,编辑(或创建)一个名为授权的文件。
在这个文件中,你应该放一行像Key mykey.pub这样的行, mykey.pub被密钥文件的名称所替代。 - 对于其他SSH服务器软件,您应该参考该服务器的手册。
您可能还需要确保您的主目录、.ssh目录和涉及的任何其他文件(例如authorized_keys、authorized_keys2或authorization)不是组可写的或world-writable的。
您通常可以通过使用诸如之类的命令来实现这一点
chmod go-w HOME/.ssh $HOME/.ssh/authorized_keys
您的服务器现在应该配置为使用您的私钥接受身份验证。
现在您需要配置PuTTY来尝试使用您的私钥进行身份验证。
你可以用三种方法中的任何一种:
- 在PuTTY的配置中选择私钥。
有关详细信息,请参见第4.22.8节。 - 在命令行中用-i选项指定密钥文件。
有关详细信息,请参见3.8.3.18节。 - 将私钥加载到Pageant中(参见第9章)。在这种情况下,PuTTY将自动尝试使用私钥进行身份验证。
【翻译不易,转载请注明出处 衡与墨https://blog.csdn.net/le_17_4_6】
未完待续
版权声明
本文章由作者“衡于墨”创作,转载请注明出处,未经允许禁止用于商业用途
评论区#
还没有评论哦,期待您的评论!
引用发言