当密码保存在 GNOME 密钥环中时,NetworkManager 无法自动连接到 WiFi 网络

当密码保存在 GNOME 密钥环中时,NetworkManager 无法自动连接到 WiFi 网络

默认情况下,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

答案1

在分析了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 语句)。

相关内容