GNOME Remote Desktop (RDP) 完整排查与修复记录

六月 13, 2026 [linux, desktop] #gnome-remote-desktop #rdp #freerdp #tls #debug #gnome-keyring #systemd

GNOME Remote Desktop (RDP) 完整排查与修复记录

环境信息

项目
操作系统Debian 13.3 (Trixie)
内核6.12.73+deb13-amd64
gnome-remote-desktop48.1-4
libfreerdp-server3.15.0+dfsg-2.1
运行模式systemd user service (--user)
用户peter (UID 1000)
主机名xiao99
证书目录~/.local/share/gnome-remote-desktop/certificates/
凭据存储GKeyFile (~/.local/share/gnome-remote-desktop/credentials.ini)
配置文件dconf/gsettings (org.gnome.desktop.remote-desktop.rdp)

初始故障现象

  1. RDP 服务可以连接(端口 3389 开放),但客户端输入用户名密码后立即断开
  2. 日志显示 Credentials are not set, denying client
  3. 配置好凭据后,连接时日志报 NTLM MIC 验证失败
  4. 通过 NLA 认证后,会话创建被阻止,日志显示 Session creation inhibited

问题一:RDP 证书缺少 X509v3 扩展

排查

# 检查证书文件是否存在
ls -la ~/.local/share/gnome-remote-desktop/certificates/
# 结果:rdp-tls.crt 和 rdp-tls.key 存在

# 检查 gsettings 证书路径
gsettings get org.gnome.desktop.remote-desktop.rdp tls-cert
gsettings get org.gnome.desktop.remote-desktop.rdp tls-key
# 结果:路径正确,指向 /home/peter/...

# 检查证书包含的 X509v3 扩展
openssl x509 -in rdp-tls.crt -text -noout | grep -E "Subject Alternative Name|Key Usage|Extended Key Usage"
# 结果:无输出 —— 旧证书缺少现代 TLS 必需的 SAN、Key Usage 等扩展字段

根因

FreeRDP 3.x 严格要求证书包含 subjectAltName (SAN)、Key UsageExtended Key Usage 等 X509v3 扩展。旧证书由 GNOME 早期版本自动生成,缺少这些扩展。

修复

# 1. 停止服务
systemctl --user stop gnome-remote-desktop.service

# 2. 删除旧证书
rm ~/.local/share/gnome-remote-desktop/certificates/rdp-tls.crt
rm ~/.local/share/gnome-remote-desktop/certificates/rdp-tls.key

# 3. 重置 gsettings 路径
gsettings reset org.gnome.desktop.remote-desktop.rdp tls-cert
gsettings reset org.gnome.desktop.remote-desktop.rdp tls-key

# 4. 生成含正确扩展的证书
HOSTNAME=$(hostname)

openssl req -x509 -newkey rsa:4096 -sha384 -days 730 -nodes \
  -keyout ~/.local/share/gnome-remote-desktop/certificates/rdp-tls.key \
  -out    ~/.local/share/gnome-remote-desktop/certificates/rdp-tls.crt \
  -subj   "/CN=$HOSTNAME" \
  -addext "subjectAltName=DNS:$HOSTNAME" \
  -addext "keyUsage=digitalSignature,keyEncipherment" \
  -addext "extendedKeyUsage=serverAuth" \
  -addext "nsCertType=server"

# 5. 验证证书与密钥匹配
openssl x509 -in ~/.local/share/gnome-remote-desktop/certificates/rdp-tls.crt -noout -modulus | md5sum
openssl rsa  -in ~/.local/share/gnome-remote-desktop/certificates/rdp-tls.key -noout -modulus | md5sum
# 两个 md5sum 必须一致

# 6. 通过 gsettings 设置证书路径
gsettings set org.gnome.desktop.remote-desktop.rdp tls-cert "/home/peter/.local/share/gnome-remote-desktop/certificates/rdp-tls.crt"
gsettings set org.gnome.desktop.remote-desktop.rdp tls-key  "/home/peter/.local/share/gnome-remote-desktop/certificates/rdp-tls.key"

踩坑:grdctl 设路径失败

grdctl rdp set-tls-cert 通过 D-Bus 与 daemon 通信,若 daemon 未运行,D-Bus 激活会以无证书状态启动 daemon,导致 BIO_new failed for certificate 错误。

解决:改用 gsettings set 直接写 dconf,避免触发 D-Bus 激活。


问题二:RDP 凭据未设置

排查

grdctl status
# 输出:Username: (empty), Password: (empty)

journalctl --user -u gnome-remote-desktop.service -f
# 日志:[RDP] Credentials are not set, denying client

根因

RDP 服务需要设置登录凭据(用户名 + 密码)才能接受客户端连接。

修复

# 尝试标准方式 —— 失败(见问题三)
grdctl rdp set-credentials peter 2021smyl
# 错误:The '/org/freedesktop/secrets/collection/login' object does not exist

# 使用 headless 模式绕过 GNOME Keyring
grdctl --headless rdp set-credentials peter 2021smyl
# 输出:Init TPM credentials failed ... using GKeyFile as fallback.

问题三:GNOME Keyring 缺少 login 密钥环

排查

# 检查是否存在密钥环集合
python3 -c "
import gi
gi.require_version('Secret', '1')
from gi.repository import Secret
service = Secret.Service.get_sync(Secret.ServiceFlags.OPEN_SESSION)
collections = service.get_collections()
for c in collections:
    print(f'{c.get_label()} ({c.get_object_path()})')
"
# 结果:No collections found

# 检查密钥环文件
ls ~/.local/share/keyrings/
# 结果:目录不存在

# 检查 D-Bus Secret Service
busctl --user call org.freedesktop.secrets /org/freedesktop/secrets \
  org.freedesktop.DBus.Properties Get ss \
  org.freedesktop.Secret.Service Collections
# 结果:只有一个 session 临时集合,无 login 密钥环

根因

用户的 GNOME Keyring login 密钥环从未被创建。通常由 GDM PAM 模块 (pam_gnome_keyring.so) 在登录时自动创建并解锁。可能原因:

grdctl rdp set-credentials 底层使用 libsecret,要求 login 密钥环存在才能存储密码。

修复

方案:使用 grdctl --headless 模式,凭据存储到 GKeyFile 文件而非 GNOME Keyring。

grdctl --headless rdp set-credentials peter 2021smyl

凭据写入 ~/.local/share/gnome-remote-desktop/credentials.ini

[RDP]
credentials={'username': <'peter'>, 'password': <'2021smyl'>}

要点:daemon 也必须以 --headless 模式运行才能读取 GKeyFile 中的凭据。


问题四:systemd Type=dbus 与 --headless 不兼容

排查

systemctl --user status gnome-remote-desktop.service
# 状态:activating (start) —— 卡在启动中
# 90 秒后超时:Failed with result 'timeout'

根因

daemon 默认以 Type=dbus 运行,systemd 等待 daemon 注册 D-Bus 名称 org.gnome.RemoteDesktop.User。但 --headless 模式下,daemon 可能在注册 D-Bus 名称前需要额外初始化(如 TPM 尝试),导致超时。

修复

创建 systemd 服务覆盖配置文件:

~/.config/systemd/user/gnome-remote-desktop.service.d/headless.conf

[Service]
Type=simple
ExecStart=
ExecStart=/usr/libexec/gnome-remote-desktop-daemon --headless

关键点:

systemctl --user daemon-reload
systemctl --user restart gnome-remote-desktop.service

问题五:Session creation inhibited(锁屏阻止远程会话)

排查

# 检查屏幕锁状态
dbus-send --session --dest=org.gnome.ScreenSaver --print-reply \
  /org/gnome/ScreenSaver org.gnome.ScreenSaver.GetActive
# 结果:boolean true —— 屏幕已锁定

# 检查会话状态
loginctl show-session 2 | grep IdleHint
# 结果:IdleHint=yes —— 会话空闲

# 服务日志
journalctl --user -u gnome-remote-desktop.service
# 关键错误:
#   Failed to start remote desktop session:
#   GDBus.Error:org.freedesktop.DBus.Error.Failed: Session creation inhibited

根因

gnome-remote-desktop 依赖活动且未锁定的 GNOME Shell 会话才能创建远程桌面会话。当屏幕锁定或会话休眠时,Mutter 会拒绝远程会话创建请求。这是 GNOME 安全策略 —— 防止在用户离开时通过远程桌面窥探屏幕。

当前环境的主 GNOME 会话 (seat0, session 2) 已空闲 近 2 周

修复(临时)

# 解除屏幕锁
gdbus call --session --dest org.gnome.ScreenSaver \
  --object-path /org/gnome/ScreenSaver \
  --method org.gnome.ScreenSaver.SetActive false

修复(永久)

关闭自动锁屏,防止长期无人使用时再次锁屏阻断 RDP:

gsettings set org.gnome.desktop.screensaver lock-enabled false
gsettings set org.gnome.desktop.screensaver idle-activation-enabled false

注意:这会彻底禁用锁屏,降低安全性。生产环境建议在 GNOME 设置中配置为"长时间不活动后锁屏"而非禁用。


最终验证

服务状态

systemctl --user status gnome-remote-desktop.service
# Active: active (running) since ...

grdctl --headless status --show-credentials
# RDP:
#   Status: enabled
#   Port: 3389
#   TLS certificate: .../rdp-tls.crt
#   TLS fingerprint: 5a:00:fe:60:...
#   TLS key: .../rdp-tls.key
#   View-only: no
#   Username: peter
#   Password: 2021smyl

端口监听

ss -tlnp | grep 3389
# LISTEN  *:3389  users:(("gnome-remote-de",pid=xxx,fd=xx))

证书信息

openssl x509 -in ~/.local/share/gnome-remote-desktop/certificates/rdp-tls.crt -text -noout | grep -E "Subject Alternative Name|Key Usage|Extended Key Usage"
#             X509v3 Subject Alternative Name:
#                DNS:xiao99
#             X509v3 Key Usage:
#                Digital Signature, Key Encipherment
#             X509v3 Extended Key Usage:
#                TLS Web Server Authentication

常用排查命令

# 查看实时日志
journalctl --user -u gnome-remote-desktop.service -f --no-pager

# 检查 RDP 配置
grdctl --headless status --show-credentials

# 检查 gsettings 完整配置
gsettings list-recursively org.gnome.desktop.remote-desktop.rdp

# 检查证书有效期
openssl x509 -in ~/.local/share/gnome-remote-desktop/certificates/rdp-tls.crt -noout -dates

# 检查证书完整信息
openssl x509 -in ~/.local/share/gnome-remote-desktop/certificates/rdp-tls.crt -text -noout

# 检查 RDP 端口监听
ss -tlnp | grep 3389

# 检查屏幕锁状态
dbus-send --session --dest=org.gnome.ScreenSaver --print-reply \
  /org/gnome/ScreenSaver org.gnome.ScreenSaver.GetActive

# 检查用户会话状态
loginctl list-sessions
loginctl show-session <session-id>

修复汇总

#问题根因修复方式
1证书无效缺少 X509v3 扩展 (SAN/KeyUsage/EKU)用 openssl 重新生成含扩展的证书
2凭据未设置从未配置 RDP 用户名密码grdctl --headless rdp set-credentials
3Keyring 不存在login 密钥环未创建,grdctl 标准模式无法存储凭据使用 --headless 模式写入 GKeyFile
4服务启动超时Type=dbus--headless 不兼容创建 systemd override,改用 Type=simple
5会话创建被阻止GNOME 桌面锁屏/空闲解除锁屏 + 关闭自动锁屏

关键文件

文件用途
~/.local/share/gnome-remote-desktop/certificates/rdp-tls.crtTLS 证书
~/.local/share/gnome-remote-desktop/certificates/rdp-tls.keyTLS 私钥
~/.local/share/gnome-remote-desktop/credentials.iniRDP 凭据 (headless 模式)
~/.config/systemd/user/gnome-remote-desktop.service.d/headless.confsystemd 服务覆盖配置
~/.config/dconf/userdconf 数据库 (gsettings 持久化)

已知限制

  1. gnome-remote-desktop 需要活动、未锁定的 GNOME Shell 会话
  2. 使用 headless + GKeyFile 模式,凭据以明文存储(TPM 不可用时)
  3. 若重启系统后问题复现,检查:
    • 屏幕是否再次锁定
    • 证书是否过期(有效期 730 天)
    • daemon 日志中是否有新的证书或会话错误