檢視原始碼 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 應用程式使用組態參數。設定位置請參閱 組態使用手冊,其中 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
- curve25519-sha256@libssh.org
- 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 演算法
- hmac-sha2-512-etm@openssh.com
- hmac-sha2-256-etm@openssh.com
- hmac-sha2-512
- hmac-sha2-256
- hmac-sha1-etm@openssh.com
- hmac-sha1
下列不安全的 SHA1
演算法預設為停用
- (hmac-sha1-96)
可以使用 preferred_algorithms 或 modify_algorithms 選項來啟用它。例如,使用選項值 {modify_algorithms, [{append, [{mac,['hmac-sha1-96']}]}]}
)
加密演算法(密碼)
- aes256-gcm@openssh.com
- aes256-ctr
- aes192-ctr
- aes128-gcm@openssh.com
- aes128-ctr
- chacha20-poly1305@openssh.com
- aes256-cbc
- aes192-cbc
- aes128-cbc
- 3des-cbc
下列不安全的演算法預設為停用
- (AEAD_AES_128_GCM)
- (AEAD_AES_256_GCM)
如需有關 AEAD_AES_*_GCM 的更多資訊,請參閱下方 rfc 5647 的說明文字。
依照網路事實標準,當協商密碼 aes128-gcm@openssh.com 時,會選取密碼和 MAC 演算法 AEAD_AES_128_GCM。當協商密碼 aes256-gcm@openssh.com 時,會選取密碼和 MAC 演算法 AEAD_AES_256_GCM。
壓縮演算法
- none
- zlib@openssh.com
- zlib
Unicode 支援
如果模擬器和底層作業系統支援 Unicode 檔名,則會支援 Unicode 檔名。如需有關此主題的資訊,請參閱 Kernel 中的 file
手冊頁面。
Shell 和 cli 都支援 Unicode。
RFC
支援下列 RFC
RFC 4251,安全殼層 (SSH) 協定架構。
例外情況
- 9.4.6 基於主機的驗證
- 9.5.2 Proxy 轉送
- 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 在已實作的密碼 aes128-gcm@openssh.com 和 aes256-gcm@openssh.com 中解決了這個問題。如果需要明確的密碼和 MAC AEAD_AES_128_GCM 或 AEAD_AES_256_GCM,可以使用選項 preferred_algorithms 或 modify_algorithms 來啟用它們。
警告
如果用戶端或伺服器不是 Erlang/OTP,則使用者有責任在啟用 AEAD_AES_*_GCM 之前,先確認其他實作具有與 Erlang/OTP SSH 相同的解釋。aes*-gcm@openssh.com 變體始終可以安全使用,因為它們沒有歧義。
第 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 公開金鑰演算法