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

时间:2017-02-03 22:12:43

标签: ssl encryption 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:\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并将其导入目标节点,结果相同。

此时,我的怀疑是,自签名的证书不足以达到目的......

1 个答案:

答案 0 :(得分:0)

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

  1. 在配置的目标节点上创建证书,包括公钥和私钥。见Securing the MOF File - Creating the Certificate on the Target Node
  2. 导出公钥
  3. 在Pull Server上导入公钥
  4. 在Pull Server上编译配置
  5. 以某种方式配置正在目标节点上运行
  6. 这被认为是一种不好的做法,但是如果你想拥有一个证书,那么这个过程将是这样的:

    1. 在Pull Server上创建证书,包括公钥和私钥。见Securing the MOF File - Creating the Certificate on the Target Node
    2. 使用Export-PfxCertificate
    3. 导出完整证书
    4. 将密钥安全地传输到目标节点(这通常不能安全地完成,为什么这是一个不好的做法)
    5. 在配置的目标节点上导入拉键
    6. 在Pull Server上编译配置
    7. 以某种方式配置正在目标节点上运行