วิธีระบุใบรับรองเซิร์ฟเวอร์ที่ผ่านการตรวจสอบแล้วสำหรับการเชื่อมต่อ Remote Desktop (RDP) กับ Windows 10


15

เรามีเครื่อง Windows 10 Pro ที่สำนักงานของเราซึ่งมีพอร์ตเปิดไปยังอินเทอร์เน็ตสำหรับการเชื่อมต่อเดสก์ท็อประยะไกลที่เข้ามา ('โฮสต์') มันได้รับการปกป้องอย่างดีด้วยรหัสผ่านที่ซับซ้อนและจำนวนครั้งที่อนุญาตที่ จำกัด และมีเพียง TLS 1.1 หรือสูงกว่า แต่มันไม่ได้แสดงใบรับรอง SSL ที่ได้รับการตรวจสอบจากภายนอกเท่านั้น ทำให้เรามีสองปัญหา:

  1. เราไม่สามารถมั่นใจได้อย่างเต็มที่เมื่อทำการเชื่อมต่อจากระยะไกลจริงๆแล้วเรากำลังเชื่อมต่อกับเครื่องนี้และไม่ได้เชื่อมต่อบางอย่างที่ถูกแย่งชิง
  2. เว็บไซต์ของเราไม่ผ่านการตรวจสอบการปฏิบัติตาม PCI-DSS 3.1 (จำเป็นเนื่องจากเราใช้เครื่องเดบิต / บัตรเครดิต ณ จุดขายที่เชื่อมต่อผ่านอินเทอร์เน็ต) การตรวจสอบจะรายงานข้อผิดพลาดที่ร้ายแรงเกี่ยวกับพอร์ตเดสก์ท็อประยะไกลที่เชื่อมต่ออินเทอร์เน็ตนี้: 'ใบรับรอง SSL ที่ลงชื่อด้วยตนเอง' และ 'ใบรับรอง SSL ที่มีชื่อโฮสต์ไม่ถูกต้อง'

ฉันจะรับเครื่อง Windows 10 Pro (หรือ Windows 7/8 / 8.1 Pro) ที่ทำหน้าที่เป็นเซิร์ฟเวอร์ / โฮสต์เพื่อแสดงใบรับรอง SSL ที่เหมาะสมสำหรับการตรวจสอบ Remote Desktop ได้อย่างไร


1
คุณสามารถวางใบรับรองแบบลงนามด้วยตนเองลงในที่เก็บใบรับรองของแต่ละเครื่องที่จะเชื่อมต่อกับเครื่องนี้ด้วยวิธีนั้นเฉพาะใบรับรองที่ลงนามด้วยตนเองเท่านั้นที่เชื่อถือได้ คุณสามารถรับใบรับรองที่ลงนามโดย CA และโดยค่าเริ่มต้นเนื่องจาก CA เชื่อถือได้ใบรับรองที่โฮสต์ต้องการใช้จะเชื่อถือได้ คุณจะไม่สามารถแก้ไขปัญหาการปฏิบัติตาม PCI-DSS 3.1 ของคุณจนกว่าคุณจะได้รับใบรับรองที่ลงนามโดย CA คุณควรทำอย่างนั้น
Ramhound

ขอบคุณ @Ramhound คุณพูดถูกฉันต้องการใบรับรองที่ลงนามโดย CA - ตอนนี้ฉันมีแล้ว
gogoud

สิ่งที่เกี่ยวข้อง -> serverfault.com/questions/444286/…
FreeSoftwareServers

คำตอบ:


16

คุณสามารถตั้งค่าเครื่องโฮสต์นี้เพื่อใช้และนำเสนอ (ที่มีอยู่ซื้อ) ใบรับรอง SSL ของคุณภายนอกตรวจสอบจึง (คำสั่งอาจจะยังทำงานสำหรับ Windows 8 และ 8.1 หรืออาจจะไม่ทำงานสำหรับ Windows 7) (ส่วนนี้อยู่บนพื้นฐานของไมโครซอฟท์ KB 2001849 ):

ก่อนอื่นคุณต้องซื้อใบรับรอง SSL ที่ตรวจสอบแล้วของแท้

หากคุณมีใบรับรองนี้ในรูปแบบไฟล์ pkcs12 (เช่นส่วนขยาย pfx) คุณสามารถดูลายนิ้วมือ SHA1 โดยใช้ Linux หรือ Cygwin ดังนั้น (คุณจำเป็นต้องใช้ด้านล่าง):

openssl pkcs12 -in mysite.pfx -nodes|openssl x509 -noout -fingerprint

หรือหากคุณมีไฟล์ใบรับรองแต่ละไฟล์ในเซิร์ฟเวอร์ Linux ของคุณที่ / etc / ssl (/etc/ssl/certs/mysite.crt, /etc/ssl/mysite.ca-bundle และ /etc/ssl/private/mysite.key ) คุณสามารถสร้างไฟล์ pfx และรับลายนิ้วมือ SHA1 ได้:

  1. สร้างไฟล์ pfx สำหรับใบรับรองของคุณหากคุณยังไม่มี (ที่นี่: mysite.pfx) - ตั้งรหัสผ่านที่ดีเมื่อมีการร้องขอ:

    sudo openssl pkcs12  -export -out mysite.pfx -inkey /etc/ssl/private/mysite.pem -in /etc/ssl/certs/mysite.crt -certfile /etc/ssl/mysite.ca-bundle
    
  2. ย้ายหรือคัดลอกไฟล์ pfx นี้ตามต้องการเพื่อให้สามารถเข้าถึงได้โดยเครื่องโฮสต์ Windows ของคุณ

  3. ดูลายนิ้วมือ SHA1 ของกุญแจ (คุณจะต้องใช้สิ่งนี้ด้านล่าง):

openssl x509 -in /etc/ssl/certs/mysite.crt -noout -fingerprint

อิมพอร์ตไฟล์รูปแบบ pkcs12 (เช่น pfx) ไปยังที่เก็บใบรับรองส่วนบุคคลของเครื่องโฮสต์ Windows:

  1. เริ่ม> เรียกใช้> mmc
  2. ไฟล์> เพิ่มลบสแนปอิน> หนังสือรับรอง> เพิ่ม> บัญชีคอมพิวเตอร์> คอมพิวเตอร์เฉพาะที่> ตกลง
  3. ในหน้าต่างซ้ายคลิกขวาที่ใบรับรอง (คอมพิวเตอร์ในพื้นที่) ส่วนตัวเลือกงานทั้งหมด / นำเข้า ...
  4. ค้นหาไฟล์ pfx และนำเข้าฉันแนะนำว่าด้วยเหตุผลด้านความปลอดภัยคุณไม่สามารถส่งออกได้
  5. ขยายส่วนบุคคล / ใบรับรองของคุณคุณควรจะเห็น 3 ใบรับรองซึ่งหนึ่งในนั้นคือใบรับรองเว็บไซต์ของคุณ (เช่น mysite.com) คลิกขวาที่ใบรับรองไซต์นี้และคลิกขวาเลือกงานทั้งหมด / จัดการคีย์ส่วนตัว ...
  6. เพิ่มผู้ใช้ 'NETWORK SERVICE' ที่มีสิทธิ์การอ่านเท่านั้น (ไม่ใช่การควบคุมทั้งหมด) จากนั้นใช้
  7. ปิด mmc

ใช้ regedit เพื่อเพิ่มค่าไบนารีใหม่ที่เรียกว่า SSLCertificateSHA1Hash HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcpที่ ค่าที่ต้องการคือลายนิ้วมือ SHA1 ของใบรับรองที่ได้รับด้านบน: คลิกขวาที่ค่าใหม่เลือกแก้ไขแล้วพิมพ์รหัสฐานสิบหกตามลำดับ (โดยไม่มีเครื่องหมายทวิภาคหรือช่องว่างหรือเครื่องหมายจุลภาคตัวอักษรไม่คำนึงถึงตัวพิมพ์ใหญ่) - มี 20 คู่สิบหกในทั้งหมด (40 ตัวอักษร)

คุณอาจต้องรีบู๊ตเครื่องโฮสต์หรือรีสตาร์ท Remote Desktop Services (จาก Services.msc) ก่อนที่มันจะทำงาน

ตอนนี้หลังจากทำการเชื่อมต่อเดสก์ท็อประยะไกลกับโฮสต์นี้โดยใช้ชื่อไซต์ที่ถูกต้อง (เช่น mysite.com) คุณควรเห็นกุญแจล็อคที่ด้านซ้ายของแถบเชื่อมต่อด้านบน: คลิกที่นี่เพื่อแสดงว่าตัวตนของรีโมต คอมพิวเตอร์ตรวจสอบแล้ว พอร์ตที่เปิดจากอินเทอร์เน็ตผ่านไปยังโฮสต์นี้ควรผ่านการทดสอบชื่อโฮสต์ PCI-DSS 3.1


ฉันต้องการโหวตให้คุณสักสองสามพันครั้ง ใช้งานได้ 100%
Shockwaver

9

นี่คือขั้นตอนพื้นฐานที่ฉันใช้:

รับใบรับรองที่ถูกต้องสำหรับโฮสต์ (ไม่ต้องมาจาก CA ภายนอก แต่ทุกเครื่องของคุณต้องเชื่อถือได้) ตรวจสอบให้แน่ใจว่ามีชื่อโฮสต์ที่ถูกต้องฉันมีปัญหากับไวด์การ์ด

ติดตั้งใบรับรองบนโฮสต์เช่น:

certutil.exe -p myPassword -importPFX c:\mycert.pfx noExport

ค้นหารหัสประจำตัวของใบรับรองทั้งใน UI หรือใน PowerShell:

$tp = (ls Cert:\LocalMachine\my | WHERE {$_.Subject -match "something unique in your certs subject field" } | Select -First 1).Thumbprint

ตอนนี้บอกให้ Remote Desktop ใช้ใบรับรองนั้น:

& wmic /namespace:\\root\CIMV2\TerminalServices PATH Win32_TSGeneralSetting Set SSLCertificateSHA1Hash="$tp" 

ไม่ต้องบูตเครื่องใหม่


SSL wildcard ของฉันทำงานได้ดี แต่ฉันยังต้องเปิด MMC และเพิ่มสิทธิ์การใช้บริการเครือข่ายไม่เช่นนั้นจะไม่ทำงาน
FreeSoftwareServers

ฉันสามารถนำเข้าไวด์การ์ดใน "Windows 10" เช่นเดียวกับ "Windows Server 2016" โดยที่เซิร์ฟเวอร์ Windows ไม่มี certutil.exe นั่นไม่ใช่เรื่องใหญ่เนื่องจากคุณสามารถนำเข้า mycert.pfx ไปที่ร้านค้าใบรับรองด้วยตนเอง ฉันไม่ต้องเปิด MMC และไม่ได้เพิ่มสิทธิ์การให้บริการเครือข่าย
TMT

1

ใบรับรองของฉันมาพร้อมกับ 2 ไฟล์ที่จำเป็น, domain.crtและdomain.ca-bundleและแล้วฉันมีของฉันdomain.keyจากการสร้างการร้องขอ

นี่คือวิธีที่ฉันตั้งค่าโดยใช้ Linux VM เพื่อรวม certs และสร้างลายนิ้วมือและ windows CMD เพื่อตั้งค่าโฮสต์ สิ่งนี้ช่วยให้การตั้งค่าสคริปต์เต็มรูปแบบ

ความแตกต่างที่ใหญ่ที่สุดระหว่างคำตอบของฉันกับ @gogoud คือ:

  • ฉันไม่แก้ไขรีจิสตรี ฉันลองและไม่ได้ผลฉันใช้wmic /namespace:ผ่านทาง CMD prompt
  • ฉันปรับแต่งบรรทัด "ลายนิ้วมือ" บน Linux VM เพื่อตัดส่วนที่ไม่จำเป็นทั้งหมดของรหัสประจำตัวและวางไว้ในรูปแบบที่ Windows ต้องการ (IE: ไม่มีเครื่องหมายทวิภาคไม่มีคำพูดเพียงแค่ลายนิ้วมือที่มีตัวอักษรตัวพิมพ์เล็ก / ใหญ่)
  • ฉันยังใช้สคริปต์เพิ่มการNETWORK SERVICEอนุญาต

ทำไดเรกทอรีให้ทำงานและย้ายไฟล์ 3 ไฟล์ไปไว้ใน:

domain.ca-bundle  domain.crt  domain.key 

สร้างคีย์รูปแบบ pfx:

sudo openssl pkcs12  -export -out domain.pfx -inkey *.key -in *.crt -certfile *.ca-bundle

ส่งออก SSLCertificateSHA1Hash / FingerPrint ไปยังไฟล์ TXT:

sudo openssl x509 -in *.crt -noout -fingerprint | sed -e 's/SHA1 Fingerprint=//g' | sed -e 's/://g' | tr '[:upper:]' '[:lower:]' > SSLCertificateSHA1Hash.txt

นำเข้า Cert ไปยัง Windows (เปิดพร้อมท์ CMD พร้อมท์):

  • สามารถเขียนสคริปต์เพิ่มเติมผ่านสวิตช์ "-p MyPassword"

    certutil.exe -importpfx C:\domain.pfx
    

ตอนนี้เพิ่ม SSLCertificateSHA1Hash ไปที่ RDP-Tcp ผ่านทาง CMD (พร้อมท์ CMD ที่สูง):

set /p FingerPrint=<C:\SSLCertificateSHA1Hash.txt
wmic /namespace:\\root\CIMV2\TerminalServices PATH Win32_TSGeneralSetting Set SSLCertificateSHA1Hash="%FingerPrint%"

คุณจะต้องเพิ่มผู้ใช้ "บริการเครือข่าย" สิทธิ์ w / "อ่านอย่างเดียว" ตอนนี้:

icacls.exe "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\*" /grant "NETWORK SERVICE":R

รีบูตโฮสต์:

 shutdown /r /t 5

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.