对远程桌面或 Remote App 快捷方式(.rdp)签名,解决无法识别此远程连接的发布者问题

小助手读文章 00:00 / 00:00

温馨提示:
本文所述内容具有依赖性,可能因软硬条件不同而与预期有所差异,故请以实际为准,仅供参考。

背景

将远程桌面或 Remote App 分发到客户端后,客户端打开每一个 .rdp 快捷方式都会提示“无法识别此远程连接的发布者。是否仍要连接?”:

错误提示.png

此时虽然仍然可以点击连接继续打开,但是每次都要点连接,且无法解决快捷方式被篡改的问题,看着也不舒服,因此我们可以考虑对 .rdp 快捷方式进行签名。由于快捷方式内容一旦变更,签名就会随之失效,因此对 .rdp 签名后客户端可以很清楚地知道快捷方式是否被纂改,而且客户端只要在首次连接时信任发布者,后续打开同签名的快捷方式都不会再提示安全问题。

.rdp 签名无法保证连接安装,如果要确保远程桌面的连接安全,则应该考虑对连接进行可信任的 SSL 证书加密,参考《RDP(MSTSC)远程桌面程连接替换使用可信任的 SSL 证书来加密连接》,使用默认生成的 SSL 证书容易被窃听且难以发现。

.rdp 快捷方式进行签名的方式有两种,一种是使用微软官方的 rdpsign 签名工具,另一种是使用基于 Python 的开源签名工具 rdpsign

签名

签名使用的证书

签名使用的 SSL 证书用法至少应包含“服务器身份验证 (1.3.6.1.5.5.7.3.1)”。我们平常签发的网站使用的 DV SSL 证书就包含这种用法,因此可以用来对 .rdp 进行签名,而诸如 S/MIME 证书则没有这种用法,也就不能用来签名。

当然我们也可以使用自签名的 SSL 证书来进行签名,但是需要注意的是,如果根证书没有在目标系统中受信任,那么签名后仍然会提示“无法识别此远程连接的发布者”。自签 SSL 证书方法可以参考《正确使用 OpenSSL 自签发代码|邮件|域名|IP 证书》。

正确签名后,打开.rdp 快捷方式的提示应该是像下面截图这样:

正常提示.png

不再提示无法识别,而是提示是否信任,只要在首次信任后以后同个 SSL 证书签名的连接都不会再提示。

微软自带 rdpsign

需要注意的是自带的签名工具 rdpsign.exe 并不是在每一个系统中都有提供,仅在 Windows Vista 和 Windows Server 2008 及之后更新版本的系统中自带。

先看下 rdpsign.exe 运行参数:

F:\>rdpsign /help
名称

rdpsign [选项] [要签名的项目]

选项

  /sha256 HASH
       指定签名证书的 SHA256 哈希。
  /q
       安静模式:  成功时没有输出,失败时最小输出。
  /v
       详细模式:  显示所有警告、消息和状态。
  /l
       测试签名和输出结果而实际不替换任何输入。当输入文件位于 stdin 中时,则忽略。

这里还要提一句, /sha256 HASH 这个参数,解释中说表示指定签名证书的 SHA256 哈希,实际上是指 指定签名证书的 SHA1 哈希,也就是我们平常所说的证书指纹,或者说证书哈希(sha1)。

签名举例

查看 SHA1 哈希值:

F:\>certutil -dump vircloud.net.crt | findstr 证书哈希(sha1)
证书哈希(sha1): 3f7de05ac2d87963ba33f7de05ac2dc2731cbdd3

对 .rdp 签名:

F:\>rdpsign /sha256 3f7de05ac2d87963ba33f7de05ac2dc2731cbdd3 vircloud.net.rdp
已成功对所有 rdp 文件进行签名。

开源工具 rdpsign

基于 Python 的开源 RDP 签名工具 rdpsign 反编译于微软的 rdpsign.exe,有兴趣了解 rdpsign.exe签名的具体工作原理,可以参看其源代码,项目 GitHub 主页:nfedera/rdpsign

先安装 rdpsign ,并看下运行参数:

[root@ct ~]# curl https://raw.githubusercontent.com/nfedera/rdpsign/master/rdpsign.py -o /usr/local/bin/rdpsign
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6758  100  6758    0     0   6515      0  0:00:01  0:00:01 --:--:--  6523
[root@ct ~]# chmod a+rx /usr/local/bin/rdpsign
[root@ct ~]# rdpsign --help
usage: rdpsign [-h] [-k signer.key] [-e encoding]
               infile.rdp outfile.rdp signer.crt

positional arguments:
  infile.rdp     rdp file to be signed
  outfile.rdp    signed rdp output file
  signer.crt     signing certificate

optional arguments:
  -h, --help     show this help message and exit
  -k signer.key  specify private key file
  -e encoding    encoding of input file (default is utf-16)

相对简单,只要指定要签名的 .rdp 文件,签名后保存的 .rdp 文件,以及用来签名的证书和密钥即可。

注意如果提示 Command not found,则需要将 /usr/local/bin 加入到系统 PATH 中。如果无法运行,则可以运行 python --version 查看 Python 是否有安装成功(源码安装方法可以参考《Linux 下如何使用源码安装 python3 以及 pip3》)。

签名举例

[root@ct ~]# rdpsign vircloud.net.rdp vircloud.net.signed.rdp vircloud.net.crt -k vircloud.net.key 

相关问题

1、问:无法找到指定的证书。错误代码: 0x80092004
答:指定用来签名的证书没有导入系统中,或者导入了但不在个人分类中,或者证书的 SHA1 哈希值错误(区别于 SHA256 哈希值)。

2、问题:无法使用指定的证书进行签名。错误代码: 0x8009200b
答:指定用来签名的证书没有包含密钥

3、问题:无法使用指定的证书进行签名。错误代码: 0x8007000d
答:证书类型不对(如指定了 S/MIME 证书)。


参考文章:

1、《rdpsign | Mircosoft Docs
2、《获取SSL证书的指纹
3、《ssl certificate - rdpsign failing with error 0x80092004 - Server Fault


相关文章:

1、《RDP(MSTSC)无法连接到远程云服务器问题分析
2、《RDP 远程桌面连接保存用户名和密码自动登录方法
3、《解决 RDP 远程桌面连接字体模糊、锯齿严重问题


ArmxMod for Typecho
个性化、自适应、功能强大的响应式主题

推广

 继续浏览关于 教程SSL证书方法rdp远程桌面签名remote app快捷方式无法识别 的文章

 本文最后更新于 2020/06/15 15:00:00,可能因经年累月而与现状有所差异

 引用转载请注明: VirCloud's Blog > 运维 > 对远程桌面或 Remote App 快捷方式(.rdp)签名,解决无法识别此远程连接的发布者问题