使用StartSSL(Let’s Encrypt)的免费SSL证书为Windows远程桌面RDS服务指定受信任的证书

首先,简单说明一下这个大标题所要解决的问题,就是这个:
QQ截图20150807221006
经常使用Windows远程桌面(AKA: mstsc3389RDP…)的朋友对这个截图的画面一定不会感到陌生,记不清从哪个版本开始的,迈克尔索芙特公司为这个远程桌面服务加入了SSL (TLS 1.0)加密功能,而且是默认开启的,这就导致了这个连接时需要“验明正身”的过程。而正式可信的SSL证书都是需要缴纳一定的“保护费”来获得的,安全级别越高,费用也就越高,所以这里默认启用的加密证书是以自签名的方式颁发的,因此自然会弹出这个不可信的警告了。
对于一般用户而言,这个不可信的证书其实也没什么大不了的,无视它,在mstsc里关闭服务器身份验证失败警告,信任它,直接添加自己为可信的证书颁发机构,又或者直接在组策略里关掉加密,都可以直接pass掉这个问题,但如果是正规应用的话(或者是像我这样有强迫症的一般用户),当然还是要加上正规身份证的好了。
这里介绍的方法就是如何用当下提供免费SSL证书的StartSSL.com,为Windows RDS(主要针对非服务器版操作系统)添加一个受信的正规远程桌面RDS服务加密证书:

这里首先假定已对StartSSL的免费SSL证书有一定的了解(比如单子域名限制等),并且已经成功的申请到了服务器SSL/TLS证书,而且最好是已经成功应用到https服务(IIS或者Apache等)了。以上的东西都可以通过百度搞定,关于StartSSL的免费证书教程有很多,喜欢哪个跟着哪个一步一步来就是了。
证书申请成功后,会得到一个私钥和一个证书,首先要做的就是将他们转换成为.p12格式,供Windows导入,这个转换过程熟悉linux的可以用openssl命令行大法搞定,不熟的话也可以直接通过StartSSL的控制台工具:Tool Box -> Create PKCS#12 (PFX) File,按照表单提示,提供私钥和证书内容,并设定一个密码,然后选择继续就可以生成.p12文件了。
然后进行证书的导入操作,要注意这个证书导入并不是像申请StartSSL账号时的那个浏览器客户端身份验证证书那样,在浏览器的证书管理中导入,这样并不能被RDS服务使用。正确的方法是使用mmc(命令行运行),然后文件->添加/删除管理单元->证书->计算机账户->本地计算机(运行此XXXXX),然后在左侧控制台节点的证书->个人下,右键单击右侧空白->所有任务->导入,然后按提示选择刚才的.p12文件,并输入正确的密码,导入成功后如下图:
QQ截图20150807221808
可以看到除了颁发给你的证书外还有StartCom(StartSSL的所属公司)的CA证书等。
下面的操作据说在Server版Windows下有专用的管理控制台进行,但是在普通Windows上(博主我用的是Win10,Win7 Win8 Win8.1理论上都一样)只能通过手改注册表的方式完成:
注册表路径为 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp
加入如下项
Value name: SSLCertificateSHA1Hash
Value type: REG_BINARY
Value data:<certificate thumbprint>
其中Value data为可以在刚才加入的证书窗口查到的颁发下来的SSL证书的sha1指纹(20个16进制数),这里貌似不能直接复制粘贴,手动敲一遍也还好,反正不多,注意别抄错就好。这步操作是为了让RDS使用指定指纹的服务器证书而不是使用那个自签名的默认证书。
完成后还差最后一步就是让RDS服务所属的 NETWORK SERVICE 账户对你的证书私钥有可读访问权限:依然是在刚才的mmc控制台,选中你的证书右键->所有任务->管理私钥,弹出的窗口和NTFS的权限管理窗口类似,在权限对话框中选添加,用户名直接输入 NETWORK SERVICE 并检查,通过后确定添加,然后保证权限中的读取为挑勾选中状态即可。
所有操作完成后重新连接远程桌面,不专业的证书警告就不会再弹出来了。

PS:说明一下,这个方法以拥有顶级域名为基础(申请免费SSL证书的条件,没有特殊需要的话也很便宜),证书设置完成后,访问远程桌面服务器就需要填写域名方式访问,而如果以局域网机器名访问的话,会提示名称不匹配警告:
QQ截图20150807235244
当然,这也是SSL证书的一个意义之所在,我这里用到的主要是DDNS的域名动态IP映射,实际上SSL只是和FQDN (fully qualified domain name,全称域名)绑定对应的,所以IP是什么根本无所谓,而且如果没有DDNS的话,通过本地host或者本地DNS解析的方式映射上域名理论上也都是可以的。

UPDATE1:

如果证书过期或其它原因导致需要替换新的证书时,需要在重新导入证书,设置私钥访问权限设置新的fingerprint后,重启系统才能生效。

UPDATE2:

最近StartSSL的证书貌似是被废了,大家可以用Let’s Encrypt的,操作方式同理…

参考文章:

博主友情提示:

如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。