powershell中建立基于证书认证的安全远程会话需配置客户端证书、远程https监听及服务器证书绑定,并启用winrm证书认证;核心步骤包括生成/安装含client authentication eku的客户端证书、在远程主机绑定server authentication证书到5986端口、设置set-item wsman:\localhost\service\auth\certificate为true,最后用new-pssession指定-certificatethumbprint完成连接。
powershell 中建立基于证书认证的安全远程会话,核心是用客户端证书替代用户名/密码进行身份验证,同时启用 https 和相互身份验证,确保连接端到端可信。这不是简单加个参数就能完成的,需提前在本地和远程主机上分别配置证书、winrm 服务和会话策略。
以下步骤聚焦于 Windows 环境下使用自签名或企业 PKI 颁发的证书实现安全远程连接(不依赖域环境,适用于工作组或混合网络):
准备并安装用于身份验证的客户端证书
该证书将代表你向远程计算机“自证身份”,必须满足以下条件:
- 有私钥且可导出(私钥不可丢失)
- 主体名称(Subject Name)或使用者可选名称(SAN)中包含你的登录标识(如
CN=AdminUser或UPN=admin@contoso.com) - 具有“客户端身份验证”(Client Authentication)增强型密钥用法(EKU)
- 安装在当前用户的“个人”证书存储区(
Cert:\CurrentUser\My\)
你可以用 PowerShell 生成测试用证书(仅限非生产环境):
$cert = New-SelfSignedCertificate -DnsName "admin@localhost" -CertStoreLocation "Cert:\CurrentUser\My" -KeyUsage DigitalSignature -KeyAlgorithm RSA -KeyLength 2048 -HashAlgorithm SHA256 -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.2")
记下生成后返回的指纹(Thumbprint),后续要用到。
在远程主机上启用 HTTPS WinRM 监听并配置证书绑定
远程计算机必须运行 WinRM 服务,并监听 HTTPS(端口 5986),且该监听需绑定一个服务器身份验证证书(即用于证明“我是谁”的证书):
- 该证书须由受信任的 CA 颁发(如企业 CA 或公共 CA),不能是自签名根证书直接绑定(除非你手动将自签名根加入远程主机的“受信任的根证书颁发机构”)
- 证书主题或 SAN 必须匹配你连接时使用的主机名(如
server01.contoso.com) - 使用
winrm create或Set-WSManInstance绑定证书到 WinRM HTTPS 监听器
示例(在远程主机上执行):
# 查找已安装的服务器证书(含 Server Authentication EKU 且匹配主机名)
$serverCert = Get-ChildItem Cert:\LocalMachine\My | Where-Object {
$_.EnhancedKeyUsageList.FriendlyName -contains "Server Authentication" -and
($_.Subject -like "*CN=server01.contoso.com*" -or $_.SubjectAlternativeNames -match "DNS Name=server01.contoso.com")
}
# 创建 HTTPS 监听器(若不存在)
if (-not (Get-WSManInstance winrm/config/listener -SelectorSet @{Address="*"; Transport="HTTPS"} -ErrorAction SilentlyContinue)) {
winrm create winrm/config/listener?Address=*+Transport=HTTPS "@{Hostname=`"server01.contoso.com`"; CertificateThumbprint=`"$($serverCert.Thumbprint)`"}"
}
在本地主机配置 WinRM TrustedHosts(仅当不用 HTTPS 或证书链不受信时才需)
如果远程主机的服务器证书不是由本地信任的 CA 签发,PowerShell 默认拒绝连接。此时有两种选择:
在 Windows 上执行终端命令,或对比 Windows 与 Linux 的 Shell 语法时使用。建议先检测当前 Shell 是 PowerShell 还是 cmd.exe,再给出相应命令……
- ✅ 推荐:将签发该服务器证书的根 CA 证书导入本地计算机或当前用户的“受信任的根证书颁发机构”存储区
- ⚠️ 不推荐(仅测试):临时绕过证书验证(禁用相互身份验证),例如:
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "server01.contoso.com" -Force
注意:这会退化为 NTLM 认证,失去服务器身份保证,生产环境严禁使用。
使用证书建立远程会话
确认以上全部就绪后,使用 New-PSSession 或 Enter-PSSession 指定证书指纹:
$session = New-PSSession -ComputerName "server01.contoso.com" `
-UseSSL `
-Port 5986 `
-Authentication Certificate `
-CertificateThumbprint "A1B2C3...FEDC" `
-Credential (Get-Credential) # 此处 Credential 仅用于初始协商,实际由证书完成主体认证
? 关键说明:
-Authentication Certificate参数要求 WinRM 服务在远程端已启用证书身份验证支持(默认未启用)。若连接失败并提示“身份验证机制不受支持”,需在远程主机运行:Set-Item WSMan:\localhost\Service\Auth\Certificate -Value $true
验证连接是否真正基于证书
成功建立会话后,可在远程会话中运行:
whoami /all
检查输出中是否有 CLIENT CERTIFICATE 对应的 SID;也可在本地查看 WinRM 日志(事件查看器 → Applications and Services Logs → Windows Remote Management)确认认证方式为 Certificate。
不复杂但容易忽略。










