[Feedback on issues] Secret Portal 缺失致 Chrome 登录丢失
Tofloor
poster avatar
wacxhs
deepin
2026-10-21 08:53
Author

一、环境信息

项目 版本/信息
系统 Deepin 25.2.2(crimson),内核 6.6.155-amd64-desktop-hwe
dde-application-manager 1.2.59
xdg-desktop-portal 1.22.1+ds-1deepin1
xdg-desktop-portal-dde 1.1.9
gnome-keyring 46.2-1deepin7
受影响应用 Google Chrome 155.0.8059.84(官方 deb 稳定版)

二、问题描述

在 Deepin 25 上,Google Chrome 每次正常关闭后重新启动,所有网站的登录状态全部丢失,必须逐站点重新登录。历史记录、扩展、已保存的网站数据等其他 profile 数据均正常,仅 Cookie/登录令牌丢失。

Chrome 自 M126 起在 Linux 上采用 os_crypt_async 机制,通过 XDG Secret Portal(org.freedesktop.portal.Secret)持久化保存 Cookie 加密密钥。该密钥一旦无法持久化,Chrome 每次启动只能使用临时随机密钥,旧 Cookie 全部解密失败并被丢弃,即产生上述现象。

三、复现步骤

  1. Deepin 25 全新/默认会话,安装官方 Chrome deb 并启动;

  2. 在任意网站登录(如 xiaohongshu.com、doubao.com 等);

  3. 正常退出 Chrome(菜单 → 退出);

  4. 重新启动 Chrome;

  5. 实际结果:所有网站均回到未登录状态;chrome://device-log 及 journal 中可见解密失败记录:

    ERROR: components/signin/public/webdata/token_service_table.cc:246] Failed to decrypt token for service AccountId-xxxx
    ERROR: google_apis/gcm/engine/gcm_store_impl.cc:938] Failed to restore security token.
    

    ~/.config/google-chrome/Local State 中记录:

    "os_crypt": { "portal": { "prev_desktop": "DDE", "prev_init_success": false } }
    
  6. 预期结果:登录状态跨重启保持。

辅助证据(数据层面):Cookie 数据库 Default/Cookies 中所有记录的创建时间均为本次 Chrome 启动的时刻,上一会话的 Cookie 一条不存;而同一 profile 的 History 数据可追溯到数月前,证明是 Cookie 加密密钥问题而非 profile 损坏。

四、根因分析

Chrome 依赖的调用链为:

Chrome
  └─► org.freedesktop.portal.Secret            (xdg-desktop-portal 前端)
        └─► org.freedesktop.impl.portal.Secret (后端实现)
              └─► gnome-keyring login 密钥环(持久化 64 字节密钥)

排查发现 Deepin 25 的前端路由配置缺失后端:

  1. /usr/share/xdg-desktop-portal/dde-portals.conf 内容仅有:
    [preferred]
    default=dde
    
  2. 默认后端 xdg-desktop-portal-dde 1.1.9 未实现 org.freedesktop.impl.portal.Secret 接口;
  3. 按 xdg-desktop-portal 的路由规则,未被列出且默认后端不支持的接口不会被前端注册。实测确认:
    $ busctl --user introspect org.freedesktop.portal.Desktop /org/freedesktop/portal/desktop | grep Secret
    (空,无任何输出)
    
  4. 于是 Chrome 调用 Secret Portal 失败 → 密钥初始化失败(prev_init_success: false)→ 使用临时密钥 → 重启后旧 Cookie 全部无法解密被清空。

而系统里现成的 gnome-keyring.portal(由 gnome-keyring 提供,DBusName=org.freedesktop.secrets)声明支持 org.freedesktop.impl.portal.Secret,后端实际工作正常,只是前端没有把它接入路由。

附带发现的相关问题(同属密钥环链路)

  1. 会话启动早期 org.gnome.keyring.SystemPrompter(gcr-prompter)激活失败,导致密钥环无法弹出解锁提示框:
    dbus-daemon: Activating service name='org.gnome.keyring.SystemPrompter' ... failed:
    Process org.gnome.keyring.SystemPrompter exited with status 1
    gnome-keyring-daemon: couldn't create system prompt
    
  2. dde-application-manager 报 gnome-keyring 自启动项检查失败:
    dde-application-manager: autostart application "gnome-keyring-secrets" couldn't pass check.
    autostart application "gnome-keyring-pkcs11" / "gnome-keyring-ssh" couldn't pass check.
    

五、修复方案(本机已验证有效)

在用户级新增 portal 路由配置 ~/.config/xdg-desktop-portal/dde-portals.conf:

[preferred]
default=dde
org.freedesktop.impl.portal.Secret=gnome-keyring

重启 portal 服务:

systemctl --user restart xdg-desktop-portal.service xdg-desktop-portal-dde.service

验证结果:

  1. 前端接口注册成功:
    $ busctl --user introspect org.freedesktop.portal.Desktop /org/freedesktop/portal/desktop | grep Secret
    org.freedesktop.portal.Secret        interface
    .RetrieveSecret                      method    ha{sv}   o
    
  2. 模拟应用调用 RetrieveSecret 连续两次,均成功返回 64 字节且内容完全一致的密钥,证明密钥已可持久化、跨启动稳定。

兼容性备注:gnome-keyring 46.2 的 Secret 后端为 v1 形态(仅暴露 RetrieveSecret,无 CreateSession/会话概念,前端版本号回退为 1)。部分新版应用可能按 v2 规范(先 CreateSession 再 RetrieveSecret)调用,届时仍会失败。建议官方一并评估后端接口版本的适配。

六、对官方的建议

  1. 主修复:在 /usr/share/xdg-desktop-portal/dde-portals.conf 中补充:

    org.freedesktop.impl.portal.Secret=gnome-keyring
    

    或在 xdg-desktop-portal-dde 中自行实现 org.freedesktop.impl.portal.Secret。

  2. 评估升级/适配 Secret Portal v2(CreateSession 会话式调用),保证与新版 Chromium/Electron 系应用的兼容性。

  3. 排查会话启动阶段 gcr-prompter(org.gnome.keyring.SystemPrompter)激活失败的问题,保证密钥环锁定时能正常弹出解锁框。

  4. 排查 dde-application-manager 对 gnome-keyring-{pkcs11,secrets,ssh}.desktop 自启动项"couldn't pass check"的判定逻辑。

七、影响范围

  • Deepin 25 上所有依赖 Secret Portal 持久化加密密钥的 Chromium 内核应用(Google Chrome、Edge、部分 Electron 应用)均会在重启后丢失登录态/Cookie,属影响面较大的基础组件问题;
  • 其他 Linux 发行版(Fedora/Ubuntu/GNOME 等)默认路由包含支持 Secret 的后端,不受影响。

八、临时缓解方案(在官方修复前)

给 Chrome 的启动命令追加 --password-store=basic,使其改用内置固定密钥方案、绕开 Portal:

Exec=/usr/bin/google-chrome-stable --password-store=basic %U

代价:Cookie 与保存的密码改用静态密钥加密,安全性低于密钥环方案,请官方与用户酌情选用。

Reply Favorite View the author
All Replies
avatar
锵锵枪ᯤ
deepin
2026-10-21 09:31
#1

🤸‍♂

Reply View the author
avatar
zccrs
deepin
2026-10-21 14:28
#2

portal 的支持已经有计划逐步完善,这个接口会作为高优先级去支持

Reply View the author