我在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:\DSC\DscPublicKey.cer
两台计算机都可以使用以下代码找到证书(使用交互式管理员用户运行)
$Cert = Get-ChildItem -Path cert:\LocalMachine\My | 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:\LocalMachine\my) | %{
# Verify the certificate is for Encryption and valid
If (($_.Issuer -eq $encryCertCN ) -and ($_.Subject -eq $encryCertCN ) )
{
return $_.Thumbprint
}
}
}
但是,Get-DSCConfigurationStatus显示失败状态。当我查看日志时,我看到了错误
Status = "Failure";
Error = "The private key could not be acquired.";
我的所有管道阶段最终都从 InDesiredState = False; 切换为 InDesiredState = True; (我假设DSC这样做是为了避免永久性的尝试做某事它没有希望实现)。
此时我唯一想到的是客户端的证书不在SYSTEM用户可以访问的位置 - 但我无法将其识别为原因。
如果 Cert:\ LocalMachine \ My 不是正确的位置 - 应该在哪里安装证书?
编辑:
证书在PULL Server上创建,并且.CER文件已导出并手动导入目标节点(现在 - 最终将在AD中处理)。我也尝试导出完整的PFX并将其导入目标节点,结果相同。
此时,我的怀疑是,自签名的证书不足以达到目的......
答案 0 :(得分:0)
基于某些假设,您将在Pull服务器上创建证书,包括公钥和私钥。然后仅导入目标节点上的公钥(.cer
文件)。问题是Pull Server不是需要私钥的机器。目标节点需要私钥。这个过程看起来应该更像这样。
这被认为是一种不好的做法,但是如果你想拥有一个证书,那么这个过程将是这样的:
Export-PfxCertificate