【Windows】【DevOps】Windows Server 2022平台启用WinRM实现远程powershell登陆 采用自签名证书开启HTTPS方案

快速配置开启WinRM(HTTP)

quiciconfig

在目标服务器上,管理员权限启动powershell,执行指令

复制代码
winrm quickconfig

输入y,完整日志如下

复制代码
PS C:\Windows\system32> winrm quickconfig
已在此计算机上运行 WinRM 服务。
WinRM 没有设置成为了管理此计算机而允许对其进行远程访问。
必须进行以下更改:

配置 LocalAccountTokenFilterPolicy 以远程向本地用户授予管理权限。

执行这些更改吗[y/n]? y

WinRM 已经进行了更新,以用于远程管理。

已配置 LocalAccountTokenFilterPolicy 以远程向本地用户授予管理权限。

当前默认服务配置状态

默认开启了HTTP 5985端口

开放TCP/5985端口

复制代码
netsh advfirewall firewall add rule name="WinRM" protocol=TCP dir=in localport=5985 action=allow

此时可以在防火墙规则中看到刚才添加的入站规则

客户端登陆

明文密码

复制代码
$username = "服务器用户名"
$password = ConvertTo-SecureString -AsPlainText "服务器密码" -Force
$cred = New-Object System.Management.Automation.PSCredential($username, $password)
Enter-PSSession -ComputerName "服务器IP地址" -Port 5985 -Credential $cred 

成功登陆远程powershell

交互式密码

复制代码
Enter-PSSession -ComputerName "服务器IP" -Port 5985 -Credential (Get-Credential)

注意:采用Get-Credential方式,需要用管理员权限打开powershell,否则会报错

Get-Credential : 无法处理命令,因为一个或多个强制参数丢失: Credential。

采用自签名证书启用WinRM的HTTPS 5986端口

以下服务器操作均在管理员权限启动的powershell中执行

查看hostname

由于证书CN需要保持与服务器主机名一致,因此,先查看主机名

复制代码
hostname

创建证书

复制代码
# 生成自签名证书
$subjectName = "CN=WIN-RKI1L4F3HTJ"
$cert = New-SelfSignedCertificate -DnsName WIN-RKI1L4F3HTJ -CertStoreLocation Cert:\LocalMachine\My -Subject "CN=WIN-RKI1L4F3HTJ" -KeyUsage DigitalSignature, KeyEncipherment -NotBefore (Get-Date) -NotAfter ((Get-Date).AddYears(10))
Get-ChildItem Cert:\LocalMachine\My | Where-Object {$_.Subject -eq "CN=WIN-RKI1L4F3HTJ"}

# 获取证书的 Thumbprint
$certificates = Get-ChildItem Cert:\LocalMachine\My | Where-Object { $_.Subject -eq $subjectName }
$thumbprint = $certificates.Thumbprint

$store = New-Object System.Security.Cryptography.X509Certificates.X509Store("MY", "LocalMachine")
$store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadOnly)
$certificates = $store.Certificates
$targetCert = $certificates | Where-Object { $_.Thumbprint -eq $thumbprint }

# 输出增强密钥用法
$targetCert.Extensions | Where-Object { $_.Oid.Value -eq '2.5.29.37' } | ForEach-Object {
     $_.Format([System.Security.Cryptography.X509Certificates.X509Extension]::NoFlags)
}

注意需要指定**-KeyUsage**参数

执行过程如下

注意,必须要有增强密钥用法:

客户端身份验证 (1.3.6.1.5.5.7.3.2), 服务器身份验证 (1.3.6.1.5.5.7.3.1)

设置 WinRM 使用证书

复制代码
winrm set winrm/config/service '@{CertificateThumbprint="证书指纹16进制字符串"}'

此处指纹需要自行复制,不能引用$thumbprint变量(不明白)

禁用未加密连接

复制代码
winrm set winrm/config/service '@{AllowUnencrypted="false"}'

删除listener

复制代码
Get-ChildItem wsman:\localhost\Listener\ | Where-Object -Property Keys -like 'Transport=HTTP*' | Remove-Item -Recurse

创建新的https监听

复制代码
New-Item -Path WSMan:\localhost\Listener\ -Transport HTTPS -Address * -CertificateThumbPrint $thumbprint -Force

效果如下

检查配置及监听状态

复制代码
winrm get winrm/config/service

Get-ChildItem wsman:\localhost\Listener

此时服务器关闭了HTTP的5985 只监听了HTTPS的5986端口

开放TCP/5986端口

复制代码
netsh advfirewall firewall add rule name="WinRM" protocol=TCP dir=in localport=5986 action=allow

客户端登陆

方案一(IP地址登陆)

复制代码
$SessionOption = New-PSSessionOption -SkipCNCheck -SkipCACheck
Enter-PSSession -ComputerName "服务器IP" -Port 5986 -UseSSL -Credential (Get-Credential) -SessionOption $SessionOption

方案二(命令行明文账号密码登陆)

复制代码
$username = "服务器用户名"
$password = ConvertTo-SecureString -AsPlainText "服务器用户密码" -Force
$cred = New-Object System.Management.Automation.PSCredential($username, $password)
$SessionOption = New-PSSessionOption -SkipCNCheck -SkipCACheck
Enter-PSSession -ComputerName "服务器地址" -Port 5986 -UseSSL -Credential $cred -SessionOption $SessionOption

方案三(主机名登陆,繁琐)

登陆服务器,导出服务器证书
复制代码
$subjectName = "CN=WIN-RKI1L4F3HTJ"
$certificates = Get-ChildItem Cert:\LocalMachine\My | Where-Object { $_.Subject -eq $subjectName }
Export-Certificate -Cert $certificates[0] -FilePath ./WIN-RKI1L4F3HTJ.cer

将证书复制到客户端

客户端配置hosts
复制代码
服务器ip 	WIN-RKI1L4F3HTJ
登陆客户端,导入证书

管理员身份启动powershell,导入证书

复制代码
Import-Certificate -FilePath D:\WIN-RKI1L4F3HTJ.cer -CertStoreLocation Cert:\LocalMachine\root\
登陆
复制代码
 Enter-PSSession -ComputerName "WIN-RKI1L4F3HTJ" -Port 5986 -UseSSL -Credential (Get-Credential)
相关推荐
荔枝吻12 小时前
【保姆级喂饭教程】Windows下安装Git Flow
windows·git·git flow
深盾科技16 小时前
深入解析 .NET 泛型:从原理到实战优化
windows·.net
石头wang19 小时前
如何在idea里快速地切换Windows CMD、git bash、powershell
windows·git·bash·intellij-idea
天高云淡ylz1 天前
各类电子设备镜像格式及文件系统统计
linux·windows·risc-v
尤达c1 天前
Jenkins on Mesos 高可用高并发部署
运维·ci/cd·devops
极限实验室1 天前
使用 Docker Compose 简化 INFINI Console 与 Easysearch 环境搭建
数据库·docker·devops
LCG元1 天前
Windows实时内核驱动的数据捕获接口:高精度时钟与零拷贝的架构剖析
windows·架构
行者游学2 天前
windows grpcurl
windows
goxingman2 天前
Spring Data JPA基本方法调用规律
windows
裁二尺秋风2 天前
CI/CD — DevOps概念之实现k8s持续交付持续集成(一)
ci/cd·kubernetes·devops