檢視原始碼 SSH 應用程式

ssh 應用程式實作了安全殼層 (SSH) 協定,並提供 SSH 檔案傳輸協定 (SFTP) 用戶端和伺服器。

描述

ssh 應用程式是 Erlang 中 SSH 協定的實作。ssh 提供 API 函式來編寫自訂的 SSH 用戶端和伺服器,以及透過 SSH 提供 Erlang Shell。其中還包括 SFTP 用戶端 ssh_sftp 和伺服器 ssh_sftpd

相依性

ssh 應用程式使用 public_keycrypto 應用程式來處理公開金鑰和加密。因此,必須載入這些應用程式,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_hostsauthorized_keys,並在 /etc/ssh 中尋找 ssh_host_*_key 檔案。這些位置可以透過選項 user_dirsystem_dir 來變更。設定位置的詳細資訊請參閱 SSH 組態

公開金鑰處理也可以透過實作 ssh_client_key_apissh_server_key_api 行為的回呼模組來自訂。

另請參閱 ssh_file 中的預設回呼模組文件。

可以使用 preferred_algorithmsmodify_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_keyssh_host_dsa_keyssh_host_ecdsa_keyssh_host_ed25519_keyssh_host_ed448_key 的檔案中找到。

詳細資訊請參閱 ssh_file

錯誤記錄器和事件處理常式

ssh 應用程式使用預設的 OTP 錯誤記錄器來記錄非預期的錯誤或列印特殊事件的相關資訊。

支援的規格和標準

支援的 SSH 版本為 2.0。

演算法

實際的演算法集可能會因電腦上安裝的 OpenSSL 加密程式庫而異。如需特定安裝的清單,請使用命令 ssh:default_algorithms/0。使用者可以覆寫伺服器端和用戶端上的預設演算法組態。請參閱 ssh:daemon/1,2,3ssh:connect/3,4 函數中的選項 preferred_algorithmsmodify_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_algorithmsmodify_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_algorithmsmodify_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_algorithmsmodify_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_algorithmsmodify_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_algorithmsmodify_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_algorithmsmodify_algorithms 來啟用它們。

    警告

    如果用戶端或伺服器不是 Erlang/OTP,則使用者有責任在啟用 AEAD_AES_*_GCM 之前,先確認其他實作具有與 Erlang/OTP SSH 相同的解釋。aes*-gcm@openssh.com 變體始終可以安全使用,因為它們沒有歧義。

    第 5.1 節中的第二段解析為

    1. 如果協商的加密演算法是 AEAD_AES_128_GCM,則 MAC 演算法會設定為 AEAD_AES_128_GCM。
    2. 如果協商的加密演算法是 AEAD_AES_256_GCM,則 MAC 演算法會設定為 AEAD_AES_256_GCM。
    3. 如果 MAC 演算法是 AEAD_AES_128_GCM,則加密演算法會設定為 AEAD_AES_128_GCM。
    4. 如果 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_algorithmsmodify_algorithms 選項啟用。

  • RFC 8332,在安全殼層 (SSH) 協定中使用帶有 SHA-256 和 SHA-512 的 RSA 金鑰。

  • RFC 8308,安全殼層 (SSH) 協定中的擴充協商。

    已實作的有

    • 擴充協商機制
    • 擴充功能 server-sig-algs
  • 使用 Curve25519 和 Curve448 的安全殼層 (SSH) 金鑰交換方法

  • RFC 8709,安全殼層 (SSH) 協定的 Ed25519 和 Ed448 公開金鑰演算法

另請參閱

應用程式