SSH 协议(Secure Shell 协议)最初在 1995 年由芬兰的 Tatu Ylönen 设计开发,由 IETF(Internet Engineering Task Force)的网络工作小组(Network Working Group)制定标准。
Tatu Ylönen 在 1995 年设计 SSH 协议,同年在芬兰成立一家名为 SSH Communications Security Corporation 开发销售 SSH 商用软件。为消除版权影响,OpenSSH 项目在 1999 年 10 月第一次出现在开源世界,该项目创立初衷就是取代 SSH Communications Security Corporation 公司的商用 SSH 软件,OpenSSH 最终成为了如今 Linux 系统标准配置,成为事实上的 SSH 协议标准实现物。
SSH 协议支持口令与密钥两种安全验证模式,但无论那种模式,最终都需要使用密钥来加密数据以确保安全,而 SSH 密钥通常使用使用的算法为 RSA 和 DSA。
在 SSH 1 协议只支持 RSA 算法,SSH 2 协议支持 RSA 和 DSA 算法。从近些年来看,DSA 变得不是那么安全,因此推荐还是使用基于 RSA 算法的密钥来建立 SSH 安全连接。
SSH 密钥的基本使用方法是,随机生成一个私钥文件,这个文件只能由你妥善保管,千万不能泄露给其他人,根据这个私钥算出公钥文件,将公钥文件发送给 SSH 连接对象进行公钥注册。当你请求与对方建立连接时,连接伊始就向对方发送你的公钥,对方将其与已注册公钥进行比对,比对合格则同意建立连接,不合格则可能拒绝连接。请求连接时,对方也会向你发送他的公钥,你也需要确认对方公钥是否合法。一旦双方都确定对方身份合法后,双方就正式建立连接,之后双方的通信均使用对方的公钥加密数据,收到对方使用己方公钥加密的数据后再用己方的私钥对数据进行解密,从而确保了通信数据的安全性。
诸如 Xshell 和 SecureCRT 这类工具都有 SSH 密钥管理功能,可以生成和使用 SSH 密钥进行安全验证。在 Linux 中,OpenSSH 提供了基于 SSH 协议的相关工具可以使用。
SSH 1 公钥格式
$ cat id-rsa1.pub 2048 65537 22910674242901951372109700514222305911005404382729826828303733202727246271129151780809328111314142444937643708197065336344061806573173759249496873454280552699704169728818376102327988617178797568649601671735522868137145364100426211002912160142668644115040507860106304962512271803001264027359406587863651664228014572232130610186228786600276455187805301282374669236217832825274065088078401281168028793885110785700945596016775112537678694431532570328169049252968039090407234623028954479983169424889698023716686474015246450335458030057416596685148084608420001646747215709382718194528577791195697244767428069870538621149641 xavier@Qbee-X
SSH 1 公钥格式为所有字段以单个空格符分隔,各字段依次为选项、位数、指数、系数、注释。第一个字段是可选的,表示该条目(行)是否以数字开头,选项字段不会以数字开头。最后一个字段注释,如果在生成密钥时没有给定注释,默认注释为密钥的创建者(一般就是 username@hostname 这种格式),注释仅仅是提供给用户查看密钥时作为一个辨识标记,在 SSH 使用中没有任何作用。
SSH 2 公钥格式
$ cat id-rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDmg/9Hoc98c6AIlEPYK6VqE3ZTlMlfXqn2VgU0NAPXeRmYX+jHYZXA5AxMNTD8KgZIuilK23qzzKBy0hgoO9DDpsBg98Pf4NLkHjTcjpPFX1TBD6RWO/OX/g4uN+gZH1/zoREJa4fit8SSG2V2GoQkqrhfRYCy+a9mQX29ZvOLfYK/aMVjb+yfzLJychdvV3CQkDvkd5R/DHNU6ZQ3pyIEjA/cUQqqmgxQj0f72y8IXv8zesXtjXaaKG17R2oSN1MNDZo/y4m426MYxl4mMQMvM5yR3UvhD93pgNgaR8LY/vspcIeE6cJZsGl21oYtrDZ/GdmF5ulMGwjIDfTJRLvb xavier@Qbee-X
SSH 2 公钥格式为所有字段以单个空格符分隔,各字段依次为选项、密钥类型(keytype)、base64编码后的密钥、注释。第一个字段是可选的,表示该条目(行)是否以数字开头,选项字段不会以数字开头。最后一个字段注释,如果在生成密钥时没有给定注释,默认注释为密钥的创建者(一般就是 username@hostname 这种格式),注释仅仅是提供给用户查看密钥时作为一个辨识标记,在 SSH 使用中没有任何作用。
密钥类型(keytype)可能是 ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, ecdsa-sha2-nistp521, ssh-ed25519, ssh-dss 或 ssh-rsa。
SSH 2 - IETF SECSH 公钥格式
---- BEGIN SSH2 PUBLIC KEY ---- AAAAB3NzaC1yc2EAAAABIwAAAIEAp7drPA+ZGAZtKNqbVxYWU5 lYPhS5HPZbyozA+KgxPhOLHI1BVoxQfsGae2OUWoy8bpzPib+U ukILHyuEyct9RWv+3OVgEzxuq4KO9y3sK1pdxycvsKwWgXPiis LVO3Zf9Dz7hR0wKzC3+IOMXfDpcEyHRVN4sNsCtPXa8BVbSys= ---- END SSH2 PUBLIC KEY ----
IETF 规定的 SSH 公钥格式被定义在 RFC4716 文件,该规范规定:
起始行和结束行必须分别是:
起始行: ---- BEGIN SSH2 PUBLIC KEY ---- 结束行: ---- END SSH2 PUBLIC KEY ----
可以添加其他头部,例如注释 Comment: user@example.com。详情参见 RFC4716。
附:
1. RFC4716