繁体   English   中英

如何使用 PowerShell 在远程计算机上安装证书?

[英]How can I install a certificate on a remote machine with PowerShell?

我正在尝试使用 PowerShell 安装证书。 我正在通过使用自己的计算机创建远程会话来测试安装。 我知道该命令是正确的,因为它在远程会话之外成功安装了证书。 当我对自己的计算机进行远程会话时,我收到错误:

访问被拒绝。 0x80070005 (WIN32: 5 ERROR_ACCESS_DENIED)。 这可能是远程计算机上需要用户凭据的结果。 请参阅 Enable-WSManCredSSP Cmdlet 帮助,了解如何通过 PowerShell 远程处理启用和使用 CredSSP 进行委派。

如果我在没有远程会话的情况下运行此命令,它将起作用:

Import-PfxCertificate -FilePath "\\network\storage\site.com.pfx" -CertStoreLocation "Cert:\\LocalMachine\\WebHosting" -Password (ConvertTo-SecureString -String "foobar" -AsPlainText -Force)

当我使用远程会话执行命令(通过Invoke-Command )时,出现上述错误:

$session = New-PSSession $Env:ComputerName
Invoke-Command -Session $session -ScriptBlock { Import-PfxCertificate -FilePath "\\network\storage\site.com.pfx" -CertStoreLocation "Cert:\\LocalMachine\\WebHosting" -Password (ConvertTo-SecureString -String "foobar" -AsPlainText -Force) }

如何解决此权限问题?

您正在遇到一个所谓的双跳身份验证问题。 如果使用普通身份验证,您将无法从正在调用该命令的计算机上对另一台计算机进行身份验证。

为了解决这个问题,您可以使用CredSSP。

要在被调用的计算机上启用CredSSP:

Enable-WSManCredSSP -Role Server -force

要在客户端上启用CredSSP:

Enable-WSManCredSSP -Role Client -DelegateComputer server.domain.com -force

-delegateComputer参数需要FQDN,但也需要通配符。

启用CredSSP后,您可以使用它来通过参数-authentication CredSSP调用命令。

我花了很多时间来解决权限问题,并最终朝另一个方向发展。 修改权限时存在缺陷/错误。 无法记住所有详细信息,但ACL属性会尝试访问您尝试更改的密钥的所有权。 对于所有人来说,这可能并不理想,但是它可以为NLA RDP的所有系统部署证书。

Set-Location "c:\windows\system32"
#if certificate is missing, will install wild card certificate into the store
icacls 'C:\ProgramData\Microsoft\Crypto\Keys' /save C:\ProgramData\Microsoft\Crypto\Keys\ACLfile_for_Keys_Dir /T
takeown /f C:\ProgramData\Microsoft\Crypto\Keys\*.*
icacls 'C:\ProgramData\Microsoft\Crypto\Keys\*.*' /grant 'Network Service:(R)'
#icacls C:\ProgramData\Microsoft\Crypto /restore  C:\ProgramData\Microsoft\Crypto\Keys\ACLfile_for_Keys_Dir #(restores original ACL for recovery)
icacls 'C:\ProgramData\Microsoft\Crypto\keys' /setowner system
icacls 'C:\ProgramData\Microsoft\Crypto\keys\*.*' /setowner system

注释出的两行是我的退出计划,以防出现问题。

这是我的第一篇文章,所以请放轻松(我在评论中将其分解为巴尼风格)。 显然这个问题仍在被问到,因为我的老板说,“嘿 powershell 书呆子,你能在远程工作站上安装一个证书或一组证书吗?”

首先,最简单的最佳方法是通过组策略(请参阅参考文档;“使用组策略分发受信任证书列表”部分)。

但是,您将无法更新 GPO 从中提取的 SST,除非您自己手动更新 SST,然后让您的 GP 管理员将其重新上传到策略中。 这一点很重要,因为新证书、过期证书和撤销证书一直在发生,而且 Microsoft 是绝对可靠的,并且始终保持其 CTL 是最新的。

要通过 Powershell 将证书导入单个远程工作站:

#这允许您告诉远程工作站从另一个工作站或服务器运行命令

调用命令 -ComputerName HOSTNAME -ScriptBlock{

#这是你的工作目录

cd C:\温度

#这将从微软的 CTL 中提取证书并将它们包装到 SST 中

Certutil -GenerateSSTFromWU -f TrustedCerts.sst

#这将创建一个访问“SST 的内容/证书”的变量

$sstStore = Get-Childitem .\TrustedCerts.sst

#Foreachofthosecerts | 将证书导入受信任的根 CA

$sststore | 导入证书-CertStoreLocation Cert:\LocalMachine\Root

}

参考文件:

https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/dn265983(v=ws.11)#redirect-the-microsoft -自动更新 url-for-a-disconnected-environment

https://docs.microsoft.com/en-us/powershell/module/pki/import-certificate?view=windowsserver2022-ps

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM