Mặc định, lưu lượng trong phiên PowerShell Remoting được mã hóa bất kể giao thức truyền HTTP (TCP/5985) hay HTTPS (TCP/5986) được sử dụng. Mọi lưu lượng đều được mã hóa bằng khóa AES-256. Tuy nhiên, nếu bạn kết nối với máy tính từ xa ngoài rừng AD hoặc trong workgroup (Kerberos không thể thiết lập mối tin cậy), bạn có nguy cơ bị tấn công man-in-the-middle. Microsoft khuyến nghị luôn sử dụng truyền tải HTTPS cho PSRemoting khi kết nối với máy tính của bên thứ ba.
Trong bài viết này, chúng tôi sẽ chỉ cách cấu hình PowerShell Remoting qua HTTPS bằng chứng chỉ SSL. Phiên PSRemoting qua HTTPS cung cấp mức độ bảo mật phiên cao hơn khi kết nối với máy tính bên ngoài domain/rừng AD của bạn.
Các bước dưới đây mô tả cách cấu hình thiết bị từ xa chạy Windows mà bạn muốn kết nối bằng PowerShell Remoting qua HTTPS.
Đảm bảo vị trí mạng trong Windows được đặt là Private hoặc Domain:
Get-NetConnectionProfile
Bật WinRM và PSRemoting bằng lệnh:
Enable-PSRemoting -Force
Trong domain, bạn có thể cấu hình WinRM bằng GPO.
Để cấu hình HTTPS cho WinRM, trước tiên bạn cần tạo chứng chỉ SSL trên máy tính bạn muốn kết nối. Chứng chỉ sẽ được dùng để mã hóa lưu lượng WinRM. Dễ hơn là tạo chứng chỉ tự ký bằng PowerShell. Trong môi trường domain, bạn có thể cấp chứng chỉ WinRM tự động bằng Auto-Enrollment.
Chỉ định tên máy tính và địa chỉ IP của nó làm tên DNS của chứng chỉ (tiện lợi nếu mạng của bạn không có máy chủ DNS). Bạn có thể lấy cả hai giá trị cho Subject Alternative Name của chứng chỉ và tạo chứng chỉ tự ký bằng PowerShell:
$hostName = $env:COMPUTERNAME
$hostIP = (Get-NetAdapter | Get-NetIPAddress).IPv4Address | Out-String
$srvCert = New-SelfSignedCertificate -DnsName $hostName,$hostIP -CertStoreLocation Cert:\LocalMachine\My
$srvCert
Chứng chỉ SSL mới sẽ xuất hiện trong kho chứng chỉ cá nhân trên máy tính.

Mặc định, hai listener trên các cổng khác nhau được tạo cho PowerShell Remoting trong Windows:
- HTTP trên cổng 5985
- HTTPS trên cổng 5986
Bạn có thể lấy danh sách các WSMan listener đang hoạt động như sau:
Get-ChildItem wsman:\localhost\Listener
Xóa listener HTTP và HTTPS mặc định:
Get-ChildItem wsman:\localhost\Listener\ | Where-Object -Property Keys -like 'Transport=HTTP*' | Remove-Item -Recurse
Tạo listener HTTPS mới và gắn chứng chỉ của bạn vào nó:
New-Item -Path WSMan:\localhost\Listener\ -Transport HTTPS -Address * -CertificateThumbPrint $srvCert.Thumbprint -Force

Tạo quy tắc Windows Firewall cho phép lưu lượng WinRM HTTPS hoặc đảm bảo nó đang hoạt động:
New-NetFirewallRule -Displayname 'WinRM - Powershell remoting HTTPS-In' -Name 'WinRM - Powershell remoting HTTPS-In' -Profile Any -LocalPort 5986 -Protocol TCP
Khởi động lại dịch vụ WinRM:
Restart-Service WinRM
Bạn có thể kiểm tra vân tay chứng chỉ mà listener WinRM HTTPS được gắn bằng lệnh này:
WinRM e winrm/config/listener
Máy chủ từ xa đã được cấu hình. Bây giờ bạn phải xuất chứng chỉ SSL ra file CER:
Export-Certificate -Cert $srvCert -FilePath c:\PS\SSL_PS_Remoting.cer
Lưu ý rằng cấu hình máy chủ và client WinRM không cho phép kết nối không mã hóa (mặc định):
dir WSMan:\localhost\Service | ? Name -eq AllowUnencrypted
dir WSMan:\localhost\Client | ? Name -eq AllowUnencrypted

Nếu cần, bạn có thể vô hiệu hóa kết nối không mã hóa như sau:
winrm set winrm/config/service '@{AllowUnencrypted="false"}'
winrm set winrm/config/client '@{AllowUnencrypted="false"}'
Sao chép file CER đến máy tính quản trị và nhập nó bằng lệnh dưới đây (hoặc triển khai chứng chỉ đến các máy tính khác bằng GPO):
Import-Certificate -FilePath c:\PS\SSL_PS_Remoting.cer -CertStoreLocation Cert:\LocalMachine\root\
Sau đó, để kết nối với máy chủ Windows từ xa bằng WinRM HTTPS, bạn phải sử dụng đối số -UseSSL trong cmdlet Enter-PSSession và Invoke-Command. Trong ví dụ sau, chúng ta sẽ kết nối với máy chủ từ xa từ bảng điều khiển PowerShell bằng địa chỉ IP của nó (lưu ý rằng chúng ta chưa thêm địa chỉ IP này vào TrustedHosts):
$SessionOption = New-PSSessionOption -SkipCNCheck
Enter-PSSession -Computername 192.168.13.4 -UseSSL -Credential maxbak -SessionOption $SessionOption

Khi kết nối bằng địa chỉ IP mà không có tùy chọn SkipCNCheck, lỗi sau xảy ra: The SSL certificate contains a common name (CN) that does not match the hostname.