使用 OpenSSL为WindowsServer远程桌面(RDP)创建自签名证书 (Self-signed SSL certificate)
前言
笔者查阅很多资料,才写成此文章,如有错误,请读者们及时提出。
一般大家使用远程桌面(Remote Desktop)连接Windows Server时,总会有一个警告提示,如图1
图1
出现此警告的原因是因为证书为服务器的自签名证书,我们的客户端无法识别,故笔者思考,如何使用证书安全的使用远程桌面(RDP)。
解决方法:
- 使用WIndowsServer自带的"AD证书服务",生成整个PKI,即拥有整套证书体系,自然所有有关认证问题迎刃而解。缺点是操作非常复杂,优点是安全,商业级别!
- 使用OpenSSL全程自己搭建证书,比方式一会节省很多步骤,使用简单,适合开发测试,缺点是安全级别不能达到用于商业的高度(其实操作者熟知PKI、X509什么的,也能做出标准的证书)
关于OpenCA:
OpenCA是一个开源项目,用于搭建私有PKI。笔者才疏学浅,尚未对此有所研究,希望有对此比较清楚的读者告知如何应用到远程桌面服务器身份认证上。-
难点:
- 客户端连接服务器远程桌面时需要检查证书吊销状态。检查证书吊销状态有两种方式: CRL与OSCP
1.1 OCSP
默认情况,证书路径验证设置使用的是OCSP,但是由于我们是自签名证书,Windows检查时始终会提示"Invalid Signer EKU"/"无效签名者 EKU",所以我们无法使用此方式验证证书吊销状态。
1.2 CRL
当OCSP不能满足我们的需求时,我们只能使用CRL来验证证书吊销状态啦,所以我们还需使用一个站点用于提供CRL - 在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
根据提示输入信息时,请读者牢记输入内容,后文有用到。
- 设置私钥
openssl genrsa -des3 -out ./demoCA/private/cakey.pem 2048
- 申请自签名证书
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/"
userNotice.1=@notice
[notice]
explicitText="Prower By Low-grade Coder"
生成服务器证书
- 设置私钥
openssl genrsa -out userkey.pem 2048
- 创建证书申请
countryName、stateOrProvinceName、organizationName默认要求与建CA时填写的要一致,如要修改规则可在openssl.cnf中[ CA_default ]里修改,
# Common Name 写域名或IP
openssl req -new -days 365 -key userkey.pem -out userreq.pem
- 签发
openssl ca -in userreq.pem -out usercert.pem -extensions v3_req -config openssl.cnf
- 制作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
导入根证书
- 把
cacert.pem改名为cacert.crt,复制到服务器,点击安装到本地计算机,至此,根证书安装完毕
导入服务器证书
- 导入
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
导入根证书
- 把
cacert.pem改名为cacert.crt,复制到服务器,点击安装到本地计算机,至此,根证书安装完毕
. 是时候结束这个磨人的小东西了
打开远程桌面 mstsc,验证结果,如图2
图2
扩展
肯定有读者会问,使用自签名证书连接远程桌面,需要客户端安装CA,岂不是很麻烦?
对此问题,一般使用此方法用于开发测试学习,如不想配置WindowsServer证书服务器或OpenCA等,可以直接使用在线服务商的证书,只需把本文相关自建证书省略,即可应用。参考Configure your Windows Remote Desktop (RDP) to use TLS with a StartSSL certificate
关于OCSP笔者研究的进展
首先修改配置文件
cacert.crt为CA证书,因为我们用的是BASE64形式的证书,所以直接改后缀*.pem->*.crt没有任何问题。
参考:那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)
[ 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和博客园,欢迎读者转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接!请读者/爬虫们尊重版权
使用 OpenSSL为WindowsServer远程桌面(RDP)创建自签名证书 (Self-signed SSL certificate)的更多相关文章
- 使用openssl创建自签名证书及部署到IIS教程
概要 本文讲解三个部分:1. 创建自签名证书2. 创建自己的证书颁发机构3. 以及如何配置IIS 创建自签名证书 首先,创建一个私钥文件: openssl genrsa -out myselfsign ...
- PowerShell自定义修改远程桌面RDP端口
应朋友的要求写了一个通过PowerShell修改远程桌面(Remote Desktop)端口的脚本,不复杂,启动脚本后有两个选项:1.自定义远程桌面:2.回复远程桌面的默认端口3389 发出来给有用的 ...
- windows修改远程桌面RDP连接数
windows 2003在默认情况下最多只允许两个用户进行远程终端连接,当达到两个远程桌面连接的到时候,再有人尝试连接,就会提示已经达到最大终端数,无法连上了. 一.windows2003终端连接数修 ...
- PCB 一键远程桌面+RDP文件生成
最近在写个内网INCAM内网授权工具中,在服务端监听客户端请求后,后台自动处理客户端请求并远程客户端 这里记录3个点. 一.运行RDP文件后,正常会有下图2个弹窗,怎么可以关闭这2个弹窗呢, 通过模拟 ...
- 关于KeePass实现mstsc远程桌面(rdp协议)的自动登录
本文的Keepass版本:KeePass Password Safe Version 2.45 首先介绍一下Keepass,引用官网的解释如下: KeePass is a free open sour ...
- 远程桌面RDP不能粘贴文本
刚才用远程桌面 登陆 服务器,突然发现不能在本机和远程服务器之间粘贴文本了,即不能从本机复制文本粘贴到服务器,也不能从服务器复制文本粘贴到本机. 在服务器上打开任务管理器,查看进程,有 rdpclip ...
- 使用 OpenSSL 为 Nginx 创建自签名证书 并开启客户端身份验证
本文章默认读者了解Openssl,CA,网站证书相关知识,直接实战!配置完成后,浏览器会显示"安全的HTTPS"连接.不会像其他文章那样,是红色警告的证书提示. 准备环境 笔者使用 ...
- OpenSSL 创建自签名证书
1.生成服务器私钥 openssl genrsa -out client.key 4096 2.生成证书签名请求(CSR) openssl req -new -key client.key -ou ...
- 自签名证书和私有CA签名的证书的区别 创建自签名证书 创建私有CA 证书类型 证书扩展名【转】
自签名的证书无法被吊销,CA签名的证书可以被吊销 能不能吊销证书的区别在于,如果你的私钥被黑客获取,如果证书不能被吊销,则黑客可以伪装成你与用户进行通信 如果你的规划需要创建多个证书,那么使用私有 ...
随机推荐
- Java NIO学习系列三:Selector
前面的两篇文章中总结了Java NIO中的两大基础组件Buffer和Channel的相关知识点,在NIO中都是通过Channel和Buffer的协作来读写数据的,在这个基础上通过selector来协调 ...
- seo外链发布之论坛外链
目前最常见的seo外链方式有5种,之前大发迹创业项目网写文章分享过,详情可以查看文章<[网站SEO优化]最常见的五种软文外链发布方式!>,这篇文章不说其他的几种发外链,就来讲讲通过论坛建设 ...
- Cow Exhibition POJ - 2184
题目地址:https://vjudge.net/problem/POJ-2184 下面的解释是从一个大佬那搬来的,讲的很清楚题意:给定一些奶牛,每个牛有s和f两个属性值,有正有负,要求选出一些牛,使得 ...
- c++学习书籍推荐《深度探索C++对象模型》下载
百度云及其他网盘下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 如果你是一位C++程序员,渴望对于底层知识获得一个完整的了解,那么这本<深度探索C++对象模型>正适合你 作者简介 ...
- C++学习书籍推荐《C++标准库(第一版)》下载
百度云及其他网盘下载地址:点我 编辑推荐 <C++标准程序库:自修教程与参考手册>编辑推荐:C++标准程序库提供了一组通用类别(classes)和界面(interfaes),可大幅扩充C+ ...
- Json串排序
最近遇到个很烦人的问题.我现在做的业务有一部分是把之前app服务端的.net接口转译java接口.但是有些之前的接口,一个接口干上十几件事情,返回的json串长达五六几百行.着实看的就让人头大.但是如 ...
- .Net Core 学习新建Core MVC 项目
一.新建空的Core web项目 二.在Startup文件中添加如下配置 1. 在ConfigureServices 方法中添加 services.AddMvc();MVC服务 2. app.Use ...
- DRF + react 实现TodoList
在web项目构建中有很多框架可供选择,开发人员对项目的使用选择,有很多的影响因素,其中之一就是框架在定义该项目的单独任务时的复杂性. 简介 本文有如下几个部分: 准备 配置后端 配置APIs 配置前端 ...
- 微信小程序开发--页面结构
一.微信小程序开发--页面文件组成 [page.name].js 页面逻辑文件,用于创建页面对象,以及处理页面生命周期控制和数据处理 [page.name].wxml wxml指的是Wei Xin M ...
- 和朱晔一起复习Java并发(三):锁(含锁性能测试)
这个专题我发现怎么慢慢演化为性能测试了,遇到任何东西我就忍不住去测一把.本文我们会大概看一下各种锁数据结构的简单用法,顺便也会来比拼一下性能. 各种并发锁 首先,我们定一个抽象基类,用于各种锁测试的一 ...