使用 OpenSSL为WindowsServer远程桌面(RDP)创建自签名证书 (Self-signed SSL certificate)

前言

笔者查阅很多资料,才写成此文章,如有错误,请读者们及时提出。

一般大家使用远程桌面(Remote Desktop)连接Windows Server时,总会有一个警告提示,如图1

图1

出现此警告的原因为证书为服务器的自签名证书,我们的客户端无法识别,故笔者思考,如何使用证书安全的使用远程桌面(RDP)。

解决方法:

  1. 使用WIndowsServer自带的"AD证书服务",生成整个PKI,即拥有整套证书体系,自然所有有关认证问题迎刃而解。缺点是操作非常复杂,优点是安全,商业级别!
  2. 使用OpenSSL全程自己搭建证书,比方式一会节省很多步骤,使用简单,适合开发测试,缺点是安全级别不能达到用于商业的高度(其实操作者熟知PKI、X509什么的,也能做出标准的证书)

关于OpenCA:

OpenCA是一个开源项目,用于搭建私有PKI。笔者才疏学浅,尚未对此有所研究,希望有对此比较清楚的读者告知如何应用到远程桌面服务器身份认证上。^-^

难点:

  1. 客户端连接服务器远程桌面时需要检查证书吊销状态。检查证书吊销状态有两种方式: CRL与OSCP

    1.1 OCSP

    默认情况,证书路径验证设置使用的是OCSP,但是由于我们是自签名证书,Windows检查时始终会提示"Invalid Signer EKU"/"无效签名者 EKU",所以我们无法使用此方式验证证书吊销状态。

    1.2 CRL

    当OCSP不能满足我们的需求时,我们只能使用CRL来验证证书吊销状态啦,所以我们还需使用一个站点用于提供CRL

  2. 在OpenSSL 中灵活使用x509v3_config。目前好多文章都没有讲到如何在证书里添加CRL分发点授权信息访问等扩展信息,究其原因就是没有理解X509z证书扩展的应用,当然也有好多文章里面有提及,但未明确指明,会让读者一头雾水。强烈推荐使用OpenSSL的读者阅读 x509v3_config - X509 V3 certificate extension configuration format

兵贵神速,马上实战!

OpenSSL

笔者使用的是Ubuntu,所以可能会出现不同操作系统OpenSSL配置文件路径不一样的情况,请读者自行根据自身情况寻找默认配置文件.

不要使用太旧的OpenSSL,当心漏洞。

准备环境

mkdir openssl.Test
cd openssl.Test
mkdir -p ./demoCA/{private,newcerts}
touch demoCA/index.txt
touch demoCA/serial
touch demoCA/crlnumber
echo 01 > demoCA/serial
echo 01 > demoCA/crlnumber
cp /etc/ssl/openssl.cnf .

自建CA

根据提示输入信息时,请读者牢记输入内容,后文有用到。

  1. 设置私钥
openssl genrsa -des3 -out ./demoCA/private/cakey.pem 2048
  1. 申请自签名证书
openssl req -new -x509 -days 365 -key ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem

调整openssl.cnf

打开我们之前复制过来的openssl.cnf

[ CA_default ]

default_crl_days= 365

确保req下存在以下2行(默认第一行是有的,第2行被注释了)

[ req ]
distinguished_name = req_distinguished_name
req_extensions = v3_req

v3_req节点示例如下:

[ v3_req ]

# 在证书请求中添加扩展

# 作为最终证书,不能用此证书作为中间证书 具体表现为在查看证书中"基本约束"为 Subject Type=End Entity
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
# 暂且理解用来扩展域名吧,DNS.1建议写服务器域名,否则在做HTTPS网站时就呵呵了(题外话), SANs是超级有用的!
subjectAltName = @alt_names
# 指定CRL地址的 必需
crlDistributionPoints = @crl_section
# CPS 说明,具体表现在查看证书"免责说明"中
certificatePolicies = @polsect

[ alt_names ]

DNS.1 = test.com
DNS.2 = a.test.com
DNS.3 = b.test.com

[crl_section]
URI.0 = http://example.com/rootca.crl

[polsect]

policyIdentifier = 2.5.29.32.0
CPS.1="http://example.com/"
[email protected]

[notice]

explicitText="Prower By Low-grade Coder"

生成服务器证书

  1. 设置私钥
openssl genrsa -out userkey.pem 2048
  1. 创建证书申请

    countryNamestateOrProvinceNameorganizationName 默认要求与建CA时填写的要一致,如要修改规则可在openssl.cnf[ CA_default ]里修改,

# Common Name 写域名或IP
openssl req -new -days 365 -key userkey.pem -out userreq.pem
  1. 签发
openssl ca -in userreq.pem -out usercert.pem -extensions v3_req -config openssl.cnf
  1. 制作pfx
openssl pkcs12 -export -inkey userkey.pem -in usercert.pem -out user.pfx

吊销证书

好吧,我们没有需要吊销的证书,暂时忽略

openssl ca -revoke usercert.pem -cert ./demoCA/cacert.pem -keyfile ./demoCA/private/cakey.pem

生成吊销列表

openssl ca -gencrl -out rootca.crl -cert ./demoCA/cacert.pem -keyfile ./demoCA/private/cakey.pem --config openssl.cnf

然后把rootca.crl部署到站点上,做到客户端使用HTTP/HTTPS协议能访问到配置文件中[crl_section]的地址即可。

准备工作到此完成!

WindowsServer

导入根证书

  1. cacert.pem改名为cacert.crt,复制到服务器,点击安装到本地计算机,至此,根证书安装完毕

导入服务器证书

  1. 导入user.pfx,本地计算机当前用户都需要导入到个人目录中。

    PS:使用"根据证书类型,自动选择证书存储"也可以啦,会默认选择个人目录的

设定远程桌面证书

使用命令 certmgr.msc 打开证书管理器,展开 个人->证书,双击我们刚刚导入的证书,选择详细信息,找到指纹,复制其内容到记事本(或命令行),去除空格,备用。

PS:那一串十六进制最前面的空格超级隐蔽。

使用命令

wmic /namespace:\\root\cimv2\TerminalServices PATH Win32_TSGeneralSetting Set  SSLCertificateSHA1Hash="刚处理的指纹"

出现更新成功字样即可,如失败,请仔细检查细节。

修改组策略

再次强调,证书默认吊销查询使用的OCSP,可是笔者至今未调通,只能通过修改组策略的方式强制走CRL,可是这样会有一系列弊端(当然也可以避免),如果有读者能使用OCSP验证证书吊销状态,此步骤可避免!届时请联系笔者!谢谢。

启动组策略 gpedit.msc
[计算机配置]->[安全设置]->[公钥策略]
打开[证书路径验证设置]
选择[吊销]选项卡
勾选[定义这些策略设置]、[始终首选证书吊销列表(CRL)而非联机证书状态协议(OCSP)响应(不推荐)(P)]

应用->重启机器。至此,服务器端配置完毕。

Windows

导入根证书

  1. cacert.pem改名为cacert.crt,复制到服务器,点击安装到本地计算机,至此,根证书安装完毕

^.^ 是时候结束这个磨人的小东西了

打开远程桌面 mstsc,验证结果,如图2

图2

扩展

肯定有读者会问,使用自签名证书连接远程桌面,需要客户端安装CA,岂不是很麻烦?

对此问题,一般使用此方法用于开发测试学习,如不想配置WindowsServer证书服务器或OpenCA等,可以直接使用在线服务商的证书,只需把本文相关自建证书省略,即可应用。参考Configure your Windows Remote Desktop (RDP) to use TLS with a StartSSL certificate

关于OCSP笔者研究的进展

首先修改配置文件

参考:[那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)](https://www.cnblogs.com/guogangj/p/4118605.html)

[ v3_req ]

.....

authorityInfoAccess = @ocsp_section

[ ocsp_section ]

caIssuers;URI.0 = http://example.com/cacert.crt

OCSP;URI.0 = http://example.com/

......

其次创建个OCSP服务端 (OCSP Responser)

openssl ocsp -index ./demoCA/index.txt -CA ./demoCA/cacert.pem -rsigner usercert.pem -rkey userkey.pem -port 8000 -text

接着再开一个终端,验证下证书

OCSP Client

openssl ocsp -issuer ./demoCA/cacert.pem -url http://example.com:8000 -serial 01 -VAfile usercert.pem

我们会观察到OCSP工作正常

Response verify OK

01: good

This Update: Aug 4 09:20:46 2018 GMT

然后打开WindowServer,导入相关证书,使用```certutil```检查

certutil -url C:\Users...\cacert.crt

选择检索方式为OCSP,点击检索最终```出现"Invalid Signer EKU"/"无效签名者 EKU"的结果。

笔者猜测毕竟我们自签名证书,服务器无法验证我们的身份吧。

参考

[SOLVED] RDP - A revocation check could not be performed for the certificate - Microsoft Remote Desktop Services - Spiceworks

RobIII: Configure your Windows Remote Desktop (RDP) to use TLS with a StartSSL certificate

RDS: RD Gateway must be configured to use an SSL certificate signed by a trusted certification authority | Microsoft Docs

Implementing an OCSP responder: Part I – Introducing OCSP | Ask the Directory Services Team

OpenSSL: how to setup an OCSP server for checking third-party certificates? - Server Fault

Windows Server 2012 R2 远程桌面安全证书警告-zlyux-51CTO博客

openssl ocsp - CSDN博客

/docs/manmaster/man5/x509v3_config.html

使用OpenSSL工具制作X.509证书的方法及其注意事项总结 - CSDN博客

How to create and administer X.509 Certificate chains, Part I

ssl - OpenSSL CA keyUsage extension - Super User

声明

本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,发表在CSDN博客园,欢迎读者转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接!请读者/爬虫们尊重版权

原文地址:https://www.cnblogs.com/chasingdreams2017/p/9420561.html

时间: 2024-11-08 09:36:52

使用 OpenSSL为WindowsServer远程桌面(RDP)创建自签名证书 (Self-signed SSL certificate)的相关文章

ms12-20 远程桌面(RDP)3389漏洞

这是12年的漏洞了,但是还有很多系统都没打补丁,在此记录下,便于以后总结. 首先列举下受影响的系统(看看你们的系统是否在里面): Windows Server 2003 Service Pack 2 Windows Vista x64 Edition Service Pack 2 Windows Server 2003 x64 Edition Service Pack 2 Windows XP Professional x64 Edition Service Pack 2 Windows Ser

使用openssl创建自签名证书及部署到IIS教程

概要 本文讲解三个部分:1. 创建自签名证书2. 创建自己的证书颁发机构3. 以及如何配置IIS 创建自签名证书 首先,创建一个私钥文件: openssl genrsa -out myselfsigned.key 2048 然后利用私钥创建自签名证书: openssl req -new -x509 -key myselfsigned.key -out myselfsigned.cer -days 36500 执行上面的两个操作之后会提示输入以下几个内容(为了显示正常尽量使用英文): Countr

远程桌面RDP报错CredSSP encryption oracle remediatation

远程桌面报错 "CredSSP encryption oracle remediation" 由于客户端或服务器端有一方 没打补丁,导致另一方拒绝 和他建立远程桌面连接 可以通过策略或改注册表 来绕过这个报错 C:\WINDOWS\system32>REG ADD HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters\ /v AllowEncryptionOracle /

com组件远程桌面rdp模块的调用

rdp(remote desktop protocol)是一个多通道的协议,包括客户端视音传输.文件传输和通讯端口转向等等功能,通过压缩处理的数据网络传输也是相当快.我们在windows操作系统下面,经常用到的mstsc.exe,也提供了com组件调用的接口. 可以建立一个winform的project,通过[工具箱]->[Choose Items]将com控件添加进来. ↑ 可以看到选项卡下面列了多个版本的组件,这里要提醒一下,它们是有版本功能的区别的,他们的clsid都是不一样的,而且代表着

如何快速创建自签名证书

在Windows中有时候e些服务需要配置证书.这时候就迫切需要一张证书来配置服务.对于测试环境,建立CA过于繁琐,使用openssl又要去找安装包很不方便,因为官方没有发布安装包需要自己编译或者找三方编译的包. 现在Windows的powechuhell终于可以方便的创建自签发的证书了.命令如下 New-SelfSignedCertificate -Subject test.ca.local -DNSName "test", "test.ca.local",&quo

Windows server 2012远程桌面服务(RDP)存在SSL / TLS漏洞的解决办法

1. 前言 为了提高远程桌面的安全级别,保证数据不被×××窃取,在Windows2003的最新补丁包SP1中添加了一个安全认证方式的远程桌面功能.通过这个功能我们可以使用SSL加密信息来传输控制远程服务器的数据,从而弥补了远程桌面功能本来的安全缺陷. 2.问题描述 在Windows server 2003和Windows server 2008,远程桌面服务SSL加密默认是关闭的,需要配置才可以使用:但 Windows server 2012默认是开启的,且有默认的CA证书.由于SSL/ TLS

Windows server 2008 禁止远程桌面连接

公司的服务器被安全扫描出3389远程连接的漏洞,处理方法简单粗暴,除了公司的公网IP,别的全部禁掉!Windows+r cmd进入本地组策略编辑器在计算机配置--->windowds设置 ----> 安全设置------>IP安全策略process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk="

创建 Android 上使用的自签名证书(Creating self-signed certificates for use on Android)

创建 Android 上使用的自签名证书 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 创建 Android 上使用的自签名证书 Creating self-signed certificat

远程桌面Default.rdp 中各个参数的含义

存储在 Default.rdp 文件中的设置 默认情况下,将在“我的文档”文件夹中创建 Default.rdp 文件.以下 RDP 设置存储在 Desktop.rdp 文件中: desktopwidth:i 此设置对应于您在远程桌面连接“选项”中的“显示”选项卡上选择的桌面宽度. 注意:基于 Microsoft Windows CE 的设备只支持全屏模式. desktopheight:i 此设置对应于您在远程桌面连接“选项”中的“显示”选项卡上选择的桌面高度. 注意:基于 Microsoft W