DSC-客户端错误-无法获取私钥



我在WMF5下有一台Windows 2012R2 DSC Pull服务器,在WMF5.1下有一个Windows 2008R2客户端。由于需要访问网络资源,凭据由Pull服务器编码到MOF中,并使用Cert:\LocalMachine\My中的证书进行加密

基于https://msdn.microsoft.com/en-us/powershell/dsc/securemof密钥是使用创建的

New-SelfsignedCertificateEx `
-Subject "CN=${ENV:ComputerName}.${ENV:UserDnsDomain}" `
-EKU 'Document Encryption' `
-KeyUsage 'KeyEncipherment, DataEncipherment' `
-SAN ${ENV:ComputerName}.${ENV:UserDnsDomain} `
-FriendlyName 'DSC Credential Encryption certificate' `
-Exportable `
-StoreLocation 'LocalMachine' `
-StoreName 'My' `
-KeyLength 2048 `
-ProviderName 'Microsoft Enhanced Cryptographic Provider v1.0' `
-AlgorithmName 'RSA' `
-SignatureAlgorithm 'SHA256' `
-NotBefore $effDate `
-NotAfter $expiryDate

我已经导出了这个证书,并将其导入到客户端计算机中,也在cert:\LocalMachine\My中使用命令

certutil -addstore My C:DSCDscPublicKey.cer

两台机器都可以使用以下代码找到证书(与交互式管理员用户一起运行)

$Cert =  Get-ChildItem -Path cert:LocalMachineMy | Where-Object {
(
($_.Issuer -eq $IssuerCN) -and ($_.Subject -eq $IssuerCN)
)
} 
Write-Host " Thumbprint : " $Cert.Thumbprint

我可以在Pull服务器上的MOF中看到加密的凭据。加密似乎按预期工作。

在客户端,MOF处理日志显示了MSFT_DSCMetaConfiguration的一个实例,该实例具有用于加密的匹配CertificateID,LCM已使用一个函数初始化,以获取正确的证书。

function Get-LocalEncryptionCertificateThumbprint 
{ 
(dir Cert:LocalMachinemy) | %{
# Verify the certificate is for Encryption and valid 
If (($_.Issuer -eq $encryCertCN ) -and ($_.Subject -eq $encryCertCN )  )
{ 
return $_.Thumbprint 
} 
} 
}

但是,Get-DSConfigurationStatus显示故障状态。当我查看日志时,我看到错误

Status = "Failure";
Error = "The private key could not be acquired.";

并且我的所有流水线阶段最终从InDesiredState=False切换InDesiredState=True(我认为DSC这样做是为了避免永远试图做一些它没有希望实现的事情)。

在这一点上,我唯一的想法是客户端的证书不在SYSTEM用户可以访问的位置,但我无法确定这是原因。

如果Cert:\LocalMachine\My不是正确的位置,则证书应安装在哪里?

编辑:

证书是在PULL服务器和上创建的。CER文件已导出并手动导入到目标节点(目前-最终将在AD中处理)。我还尝试导出完整的PFX并将其导入到目标节点,结果相同。

在这一点上,我怀疑生成的证书是自签名的,不足以达到目的。。。

基于一些假设,您正在Pull服务器上创建证书,包括公钥和私钥。然后只导入目标节点上的公钥(.cer文件)。问题是Pull服务器不是需要私钥的机器。目标节点需要私钥。这个过程应该更像这样。

  1. 在配置的目标节点上创建证书,包括公钥和私钥。请参阅保护MOF文件-在目标节点上创建证书
  2. 正在导出公钥
  3. 在"拉"服务器上导入公钥
  4. 在Pull服务器上编译配置
  5. 不知怎的,配置正在目标节点上运行

这被认为是一种糟糕的做法,但如果你想有一个证书,过程会是这样的:

  1. 在Pull服务器上创建证书,包括公钥和私钥。请参阅保护MOF文件-在目标节点上创建证书
  2. 使用Export-PfxCertificate导出完整证书
  3. 安全地将密钥传输到目标节点(这通常不安全,以及为什么这是一种糟糕的做法)
  4. 正在导入配置的目标节点上的拉键
  5. 在Pull服务器上编译配置
  6. 不知怎的,配置正在目标节点上运行

最新更新