温馨提示:
本文所述内容具有依赖性,可能因软硬条件不同而与预期有所差异,故请以实际为准,仅供参考。
背景
将远程桌面或 Remote App 分发到客户端后,客户端打开每一个 .rdp
快捷方式都会提示“无法识别此远程连接的发布者。是否仍要连接?”:
此时虽然仍然可以点击连接
继续打开,但是每次都要点连接,且无法解决快捷方式被篡改的问题,看着也不舒服,因此我们可以考虑对 .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
快捷方式的提示应该是像下面截图这样:
不再提示无法识别,而是提示是否信任,只要在首次信任后以后同个 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 远程桌面连接字体模糊、锯齿严重问题》