背景

最近,由于学校的某门课程要用到一个 Windows only 的软件,而我又不想使用 Boot Camp / 虚拟机之类的解决方式,因此最后选择在套路云上开了一台 抢占式实例,利用停机不收费、流量按量计费等特性获得了一台暂时性、价格尚可接受、性能不错的 Windows 云服务器。

在使用 Microsoft Remote Desktop (BTW, 这玩意的评分只有 2 星不到,太惨了) 远程连接到 Windows Server 时,会弹出一个「无法验证证书,您的连接可能不安全」之类的提示。这是因为 Windows 远程桌面服务默认会使用自签证书来进行连接。尽管可以直接忽略提示甚至选择始终信任,但是这毫无疑问让咱这个强迫症非常不爽…

通常情况下,使用可信 CA 签发的服务器证书即可解决这个问题。不过,由于我比较懒只是暂时性使用,就懒得再去用 certbot 申请 Let’s Encrypt 的证书了,直接全部用自签名证书搞定(逃

签发根证书

参考 为 Surge 自签发 CA 根证书,完成后需要在 Keychain Access 中添加并信任证书。

简单示例:

openssl ecparam -genkey -name prime256v1 -out ca.key  # 生成 ECC 私钥

openssl req -x509 -new -sha256 -key ca.key -days 3650 -out ca.crt -subj "/CN=Custom CA"

签发服务器证书

生成私钥

openssl genrsa -out server.key 2048  # 生成 RSA 私钥

# 或者
openssl ecparam -genkey -name prime256v1 -out server.key  # 生成 ECC 私钥

生成证书请求

openssl req -new -sha256 -key server.key -out server.csr -subj "/CN=<domain or ip>"

# 请自行将 <domain or ip> 替换为服务器域名或 IP 地址

签发证书

# 使用 openssl x509 工具
openssl x509 -req -sha256 -days 820 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile <(printf "extendedKeyUsage=serverAuth\nsubjectAltName=DNS:<domain or ip>") -out server.crt

# 或者使用 openssl ca (需要准备好 index.txt, serial 和 openssl.cnf)
openssl ca -in server.csr -out server.crt -outdir . -cert ca.crt -keyfile ca.key -startdate 20200101000000Z -enddate 20211231000000Z -config openssl.cnf -extfile <(printf "extendedKeyUsage=serverAuth\nsubjectAltName=DNS:<domain or ip>") -notext -md sha256 -policy policy_anything

# 请自行将 <domain or ip> 替换为服务器域名或 IP 地址
# 证书有效期不能超过 825 天,macOS 下必须指定摘要算法为 SHA-256,参见 https://support.apple.com/zh-cn/HT210176

导出 pfx 格式的证书

openssl pkcs12 -export -inkey server.key -in server.crt -out server.pfx -password pass:<password>

# <password> 为证书密码,在下面安装证书时需要用到

获取证书指纹

openssl x509 -fingerprint -in server.crt | head -n 1 | cut -d '=' -f2 | tr -d ':' | tr '[:upper:]' '[:lower:]'

# Copy 下来稍后会用

安装服务器证书

安装 pfx 格式的证书

连接到 Windows Server,双击打开 pfx 格式的证书,存储位置选择「本地计算机」 > 文件名默认 > 输入密码 & 其他设置默认 > 选择「将所有的证书都放入下列存储 - 个人」> 完成。

安装证书

配置 RDP 服务

打开 Windows PowerShell,执行以下命令:

wmic /namespace:\\root\cimv2\TerminalServices PATH Win32_TSGeneralSetting Set SSLCertificateSHA1Hash="<上面获取的证书指纹>"

配置 RDP 服务

提示「属性更新成功」即可。

测试连接

断开远程桌面连接,重新连接,此时应该已经没有证书未受信任的提示了。

移除服务器证书

如果要移除服务器上安装的证书,则右击开始菜单 > 运行 > 打开 certlm.msc,在 证书 - 本地计算机 > 个人 > 证书下删除安装的证书即可。

使用可信 CA 签发的证书

如果你有可信 CA 签发的证书,那么只需要从 导出 pfx 格式的证书 这一步往后操作即可。

垃圾 Windows 毁我青春,耗我时光


参考及感谢