查看源代码 SSH 应用程序
ssh 应用程序实现了安全外壳 (SSH) 协议,并提供了 SSH 文件传输协议 (SFTP) 客户端和服务器。
描述
ssh
应用程序是 Erlang 中 SSH 协议的实现。ssh
提供了 API 函数,用于编写自定义的 SSH 客户端和服务器,以及通过 SSH 使 Erlang shell 可用。还包括 SFTP 客户端 ssh_sftp
和服务器 ssh_sftpd
。
依赖关系
ssh
应用程序使用 public_key
和 crypto
应用程序来处理公钥和加密。因此,必须加载这些应用程序,ssh
应用程序才能工作。调用 ssh:start/0
将在启动 ssh
本身之前,执行必要的 application:start/1,2 调用。
配置
SSH 应用程序使用配置参数。 设置它们的位置在 config 用户指南 中描述,SSH 的详细信息在 SSH 中的配置 中。
还使用来自 OpenSSH 的一些特殊配置文件
known_hosts
authorized_keys
authorized_keys2
id_dsa
(支持但默认禁用)id_rsa
(支持 SHA1 签名/验证,但在 OTP-24 中默认禁用)id_ecdsa
id_ed25519
id_ed448
ssh_host_dsa_key
(支持但默认禁用)ssh_host_rsa_key
(支持 SHA1 签名/验证,但在 OTP-24 中默认禁用)ssh_host_ecdsa_key
ssh_host_ed25519_key
ssh_host_ed448_key
默认情况下,ssh
在 ~/.ssh
中查找 id_*
、known_hosts
和 authorized_keys
,在 /etc/ssh
中查找 ssh_host_*_key 文件。 这些位置可以通过选项 user_dir
和 system_dir
进行更改。 有关在何处设置它们的更多信息,请参阅 SSH 中的配置。
还可以通过实现行为 ssh_client_key_api
和 ssh_server_key_api
的回调模块来自定义公钥处理。
另请参阅 ssh_file
中的默认回调模块文档。
可以使用 preferred_algorithms 或 modify_algorithms 选项启用禁用的公钥算法。 有关说明,请参阅 在 SSH 中配置算法 中的 示例 9。
公钥
id_*
是用户的私钥文件。 请注意,公钥是私钥的一部分,因此 ssh
应用程序不使用 id_*.pub
文件。 这些文件是为了方便用户在需要传达用户的公钥时使用。
有关详细信息,请参阅 ssh_file。
已知主机
known_hosts
文件包含已批准的服务器及其公钥的列表。 列出服务器后,无需用户交互即可验证它。
有关详细信息,请参阅 ssh_file。
授权密钥
authorized_key
文件跟踪用户授权的公钥。 此文件最常见的用途是让用户无需输入密码即可登录,Erlang ssh
守护程序支持此功能。
有关详细信息,请参阅 ssh_file。
主机密钥
支持 RSA、DSA(如果启用)、ECDSA、ED25519 和 ED448 主机密钥,并且预计在名为 ssh_host_rsa_key
、ssh_host_dsa_key
、ssh_host_ecdsa_key
、ssh_host_ed25519_key
和 ssh_host_ed448_key
的文件中找到它们。
有关详细信息,请参阅 ssh_file。
错误记录器和事件处理程序
ssh
应用程序使用默认的 OTP 错误记录器来记录意外错误或打印有关特殊事件的信息。
支持的规范和标准
支持的 SSH 版本为 2.0。
算法
实际算法集可能因机器上安装的 OpenSSL 加密库而异。 有关特定安装的列表,请使用命令 ssh:default_algorithms/0
。 用户可以在服务器端和客户端覆盖默认的算法配置。 请参阅 ssh:daemon/1,2,3 和 ssh:connect/3,4 函数中的选项 preferred_algorithms 和 modify_algorithms。
支持的算法是(按默认顺序)
密钥交换算法
- curve25519-sha256
- [email protected]
- curve448-sha512
- ecdh-sha2-nistp521
- ecdh-sha2-nistp384
- ecdh-sha2-nistp256
- diffie-hellman-group-exchange-sha256
- diffie-hellman-group16-sha512
- diffie-hellman-group18-sha512
- diffie-hellman-group14-sha256
以下不安全的 SHA1
算法现在默认禁用
- (diffie-hellman-group14-sha1)
- (diffie-hellman-group-exchange-sha1)
- (diffie-hellman-group1-sha1)
可以使用 preferred_algorithms 或 modify_algorithms 选项启用它们。 例如,使用选项值 {modify_algorithms, [{append, [{kex,['diffie-hellman-group1-sha1']}]}]}
)
公钥算法
- ssh-ed25519
- ssh-ed448
- ecdsa-sha2-nistp521
- ecdsa-sha2-nistp384
- ecdsa-sha2-nistp256
- rsa-sha2-512
- rsa-sha2-256
以下不安全的 SHA1
算法受支持但默认禁用
- (ssh-dss)
- (ssh-rsa)
可以使用 preferred_algorithms 或 modify_algorithms 选项启用禁用的公钥算法。 有关说明,请参阅 在 SSH 中配置算法 中的 示例 9。
MAC 算法
- [email protected]
- [email protected]
- hmac-sha2-512
- hmac-sha2-256
- [email protected]
- hmac-sha1
以下不安全的 SHA1
算法默认禁用
- (hmac-sha1-96)
可以使用 preferred_algorithms 或 modify_algorithms 选项启用它。 例如,使用选项值 {modify_algorithms, [{append, [{mac,['hmac-sha1-96']}]}]}
)
加密算法(密码)
- [email protected]
- aes256-ctr
- aes192-ctr
- [email protected]
- aes128-ctr
- [email protected]
- aes256-cbc
- aes192-cbc
- aes128-cbc
- 3des-cbc
以下不安全的算法默认禁用
- (AEAD_AES_128_GCM)
- (AEAD_AES_256_GCM)
有关 AEAD_AES_*_GCM 的更多信息,请参阅 rfc 5647 的进一步说明 中的文本。
按照事实上的互联网标准,当协商密码 [email protected] 时,选择密码和 mac 算法 AEAD_AES_128_GCM。当协商密码 [email protected] 时,选择密码和 mac 算法 AEAD_AES_256_GCM。
压缩算法
- none
- [email protected]
- zlib
Unicode 支持
如果模拟器和底层操作系统支持,则支持 Unicode 文件名。 有关此主题的信息,请参阅 Kernel 中的 file
手册页。
shell 和 cli 都支持 unicode。
RFC
支持以下 RFC
RFC 4251,安全外壳 (SSH) 协议体系结构。
例外
- 9.4.6 基于主机的身份验证
- 9.5.2 代理转发
- 9.5.3 X11 转发
RFC 4252,安全外壳 (SSH) 身份验证协议。
例外
- 9. 基于主机的身份验证:“hostbased”
RFC 4253,安全外壳 (SSH) 传输层协议。
例外
- 8.1. diffie-hellman-group1-sha1
- 6.6. 公钥算法
- ssh-dss
- ssh-rsa
它们默认禁用,因为它们现在被认为是不安全的,但可以使用 preferred_algorithms 或 modify_algorithms 选项启用它们。 有关说明,请参阅 在 SSH 中配置算法 中的 示例 8 (diffie-hellman-group1-sha1) 和 示例 9 (ssh-dss)。
RFC 4254,安全外壳 (SSH) 连接协议。
例外
- 6.3. X11 转发
- 7. TCP/IP 端口转发
RFC 4256,安全外壳协议 (SSH) 的通用消息交换身份验证。
例外
num-prompts > 1
- 密码更改
- userid-password 以外的其他标识方法
RFC 4419,安全外壳 (SSH) 传输层协议的 Diffie-Hellman 组交换。
例外
- 4.1. diffie-hellman-group-exchange-sha1
它默认禁用,因为现在被认为是不安全的,但可以使用 preferred_algorithms 或 modify_algorithms 选项启用它。
RFC 4716,安全外壳 (SSH) 公钥文件格式。
RFC 5647,安全外壳传输层协议的 AES Galois 计数器模式。
密码和 mac 算法的同步选择存在歧义。 OpenSSH 通过实现的密码 [email protected] 和 [email protected] 解决了这个问题。 如果需要显式密码和 mac AEAD_AES_128_GCM 或 AEAD_AES_256_GCM,可以使用选项 preferred_algorithms 或 modify_algorithms 启用它们。
警告
如果客户端或服务器不是 Erlang/OTP,则用户有责任在启用它们之前检查其他实现是否与 Erlang/OTP SSH 对 AEAD_AES_*_GCM 的解释相同。 aes*[email protected] 变体始终可以安全使用,因为它们没有歧义。
第 5.1 节中的第二段解析为
- 如果协商的密码是 AEAD_AES_128_GCM,则 mac 算法设置为 AEAD_AES_128_GCM。
- 如果协商的密码是 AEAD_AES_256_GCM,则 mac 算法设置为 AEAD_AES_256_GCM。
- 如果 mac 算法是 AEAD_AES_128_GCM,则密码设置为 AEAD_AES_128_GCM。
- 如果 mac 算法是 AEAD_AES_256_GCM,则密码设置为 AEAD_AES_256_GCM。
应用从顶部按顺序读取时匹配的第一个规则
RFC 5656,安全外壳传输层中的椭圆曲线算法集成。
例外
- 5. ECMQV 密钥交换
- 6.4. ECMQV 密钥交换和验证方法名称
- 7.2. ECMQV 消息编号
- 10.2. 推荐曲线
RFC 6668,安全外壳(SSH)传输层协议的 SHA-2 数据完整性验证
注释:定义了 hmac-sha2-256 和 hmac-sha2-512
Draft-ietf-curdle-ssh-kex-sha2 (工作中),安全外壳(SSH)密钥交换(KEX)方法更新和建议。
偏差
diffie-hellman-group1-sha1
diffie-hellman-group-exchange-sha1
diffie-hellman-group14-sha1
默认情况下不启用,因为它们现在被认为是不安全的,但仍然支持,并且可以使用 preferred_algorithms 或 modify_algorithms 选项启用。
RFC 8332,安全外壳(SSH)协议中带有 SHA-256 和 SHA-512 的 RSA 密钥的使用。
RFC 8308,安全外壳(SSH)协议中的扩展协商。
已实现:
- 扩展协商机制
- 扩展
server-sig-algs
RFC 8709,用于安全外壳(SSH)协议的 Ed25519 和 Ed448 公钥算法