Networking

當密碼保存在 GNOME 密鑰環中時,NetworkManager 無法自動連接到 WiFi 網路

  • August 11, 2019

預設情況下,NetworkManager 將 WiFi 密碼以純文字形式*.nmconnection儲存在/etc/NetworkManager/system-connections/. 這對我來說是不可接受的,所以我決定使用nm-connection-editor. 在那裡我檢查了Store the password only for this user選項。這具有將密碼儲存在 GNOME 密鑰環中而不是純文字中的效果。

但是這個解決方案有一個問題:NetworkManager 在電腦啟動時作為一個 systemd 單元啟動。此時 GNOME 密鑰環還沒有啟動。它稍後將在成功登錄後由我的顯示管理器啟動,並使用我的使用者密碼(與密鑰環的密碼相同)自動解鎖。因此,很明顯,NetworkManager 無法從密鑰環中獲取密碼,並發出以下日誌:

NetworkManager[610]: <warn> [1565208122.6857] device (wlp2s0): no secrets: No agents were available for this request.

我登錄後沒有WiFi連接。我必須點擊 nm-applet 並選擇我的 WiFi 網路。在此之後它已連接,但我希望它自動發生。

是我的配置有問題嗎?如果是這樣,我該如何解決?

為了完整起見,這是我的配置:

  • 作業系統:Arch Linux
  • 顯示管理器:SDDM
  • 視窗管理器:i3

在分析了 NetworkManager 的原始碼後,我發現了問題所在。如果 NetworkManager 無法從密鑰環中獲取機密資訊,它將阻止連接自動連接。看起來這種行為是不可配置的,並且在 nm-policy.c 中進行了硬編碼:

https://github.com/NetworkManager/NetworkManager/blob/master/src/nm-policy.c

在 1830 行附近有一段程式碼:

if (nm_device_state_reason_check (reason) == NM_DEVICE_STATE_REASON_NO_SECRETS) {
   /* ... */
   con_v = nm_settings_connection_get_last_secret_agent_version_id (sett_conn);
   if (   con_v == 0
       || con_v == nm_agent_manager_get_agent_version_id (priv->agent_mgr))
           block_no_secrets = TRUE;
}

if (block_no_secrets) {
   _LOGD (LOGD_DEVICE, "connection '%s' now blocked from autoconnect due to no secrets",
       nm_settings_connection_get_id (sett_conn));
       nm_settings_connection_autoconnect_blocked_reason_set (sett_conn, NM_SETTINGS_AUTO_CONNECT_BLOCKED_REASON_NO_SECRETS, TRUE);
}

破解此行為並使 NetworkManager 不阻止自動連接的連接的最簡單方法是不將其設置block_no_secrets為 TRUE(只需將其設置為 FALSE 或完全刪除第一個 if 語句)。

引用自:https://unix.stackexchange.com/questions/534439