標籤:tps 標準 space image 個人 terminal www 遠端桌面服務 amp
前言
筆者查閱很多資料,才寫成此文章,如有錯誤,請讀者們及時提出。
一般大家使用遠端桌面(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.Testcd openssl.Testmkdir -p ./demoCA/{private,newcerts} touch demoCA/index.txt touch demoCA/serialtouch demoCA/crlnumberecho 01 > demoCA/serialecho 01 > demoCA/crlnumbercp /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_namereq_extensions = v3_req
v3_req節點樣本如下:
[ v3_req ]# 在認證請求中添加擴充# 作為最終認證,不能用此認證作為中間認證 具體表現為在查看認證中"基本約束"為 Subject Type=End EntitybasicConstraints = CA:FALSEkeyUsage = nonRepudiation, digitalSignature, keyEncipherment# 暫且理解用來擴充網域名稱吧,DNS.1建議寫伺服器網域名稱,否則在做HTTPS網站時就呵呵了(題外話), SANs是超級有用的!subjectAltName = @alt_names# 指定CRL地址的 必需crlDistributionPoints = @crl_section# CPS 說明,具體表現在查看認證"免責說明"中certificatePolicies = @polsect[ alt_names ]DNS.1 = test.comDNS.2 = a.test.comDNS.3 = b.test.com[crl_section]URI.0 = http://example.com/rootca.crl[polsect]policyIdentifier = 2.5.29.32.0CPS.1="http://example.com/"[email protected][notice]explicitText="Prower By Low-grade Coder"
產生伺服器憑證
- 設定私密金鑰
openssl genrsa -out userkey.pem 2048
- 建立認證申請
countryName
、stateOrProvinceName
、organizationName
預設要求與建CA時填寫的要一致,如要修改規則可在openssl.cnf
中[ CA_default ]
裡修改,
# Common Name 寫網域名稱或IPopenssl 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
開啟Cert Manager,展開 個人
->認證
,雙擊我們剛剛匯入的認證,選擇詳細資料
,找到指紋
,複製其內容到記事本(或命令列),去除空格
,備用。
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筆者研究的進展
首先修改設定檔
參考:[那些認證相關的玩意兒(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和部落格園,歡迎讀者轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連!請讀者/爬蟲們尊重著作權
使用 OpenSSL為WindowsServer遠端桌面(RDP)建立自我簽署憑證 (Self-signed SSL certificate)