GNOME Remote Desktop (RDP) 完整排查与修复记录
六月 13, 2026 [linux, desktop] #gnome-remote-desktop #rdp #freerdp #tls #debug #gnome-keyring #systemdGNOME Remote Desktop (RDP) 完整排查与修复记录
环境信息
| 项目 | 值 |
|---|---|
| 操作系统 | Debian 13.3 (Trixie) |
| 内核 | 6.12.73+deb13-amd64 |
| gnome-remote-desktop | 48.1-4 |
| libfreerdp-server | 3.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) |
初始故障现象
- RDP 服务可以连接(端口 3389 开放),但客户端输入用户名密码后立即断开
- 日志显示
Credentials are not set, denying client - 配置好凭据后,连接时日志报 NTLM MIC 验证失败
- 通过 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 Usage、Extended 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) 在登录时自动创建并解锁。可能原因:
- 用户通过 SSH 或 tty 登录而非 GDM
- PAM 配置未正确加载 gnome-keyring 模块
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
关键点:
- 第一行
ExecStart=清空上游配置中的 ExecStart Type=simple替代Type=dbus,daemon 启动即视为就绪
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 |
| 3 | Keyring 不存在 | login 密钥环未创建,grdctl 标准模式无法存储凭据 | 使用 --headless 模式写入 GKeyFile |
| 4 | 服务启动超时 | Type=dbus 与 --headless 不兼容 | 创建 systemd override,改用 Type=simple |
| 5 | 会话创建被阻止 | GNOME 桌面锁屏/空闲 | 解除锁屏 + 关闭自动锁屏 |
关键文件
| 文件 | 用途 |
|---|---|
~/.local/share/gnome-remote-desktop/certificates/rdp-tls.crt | TLS 证书 |
~/.local/share/gnome-remote-desktop/certificates/rdp-tls.key | TLS 私钥 |
~/.local/share/gnome-remote-desktop/credentials.ini | RDP 凭据 (headless 模式) |
~/.config/systemd/user/gnome-remote-desktop.service.d/headless.conf | systemd 服务覆盖配置 |
~/.config/dconf/user | dconf 数据库 (gsettings 持久化) |
已知限制
- gnome-remote-desktop 需要活动、未锁定的 GNOME Shell 会话
- 使用 headless + GKeyFile 模式,凭据以明文存储(TPM 不可用时)
- 若重启系统后问题复现,检查:
- 屏幕是否再次锁定
- 证书是否过期(有效期 730 天)
- daemon 日志中是否有新的证书或会话错误