PowerShell DSC 凭据解密错误

PowerShell DSC Credential Decryption Error

我已经创建了一个 Pull 服务器配置。也用于编译 MOF 文件的 Pull 服务器和客户端都是 Windows Server 2016,完全从 Azure Image 更新。

我在传递凭据时不断出错。因此,当我 运行 Start-DSCConfiguration -Wait -Verbose

时,我写了一个小的自定义 DSC 资源,它将密码显示为清晰的 txt

您可以在这里找到它:https://gist.github.com/aboersch/65e846a4966fe2c4708ed21d655a54a7

客户端未正确解密凭据。作为我收到的密码

-----BEGIN CMS-----
<Long Multi-Line Base64 String>
-----END CMS-----

如果我将其传递给 Unprotect-CmsMessage,我会收到正确的密码。

证书通过 $.PrivateKey.KeyExchangeAlgorithm 和 $.Verify

我已尝试将证书提供商更改为“"Microsoft Enhanced Cryptographic Provider v1.0"”、“"Legacy Cryptographic Service Provider"”和“"Microsoft RSA SChannel Cryptographic Provider"”。

我也尝试过 xDSCUtils New-xSelfSignedDscEncryptionCertificate。

如果我使用相同的证书并在同一台服务器上编译和执行是没有问题的。

我已经尝试过这些: DSC problems with Credentials and build 10586 https://wespoint.wordpress.com/2017/01/19/powershell-dsc-encryption-issue/

以下是证书属性:

EnhancedKeyUsageList     : {Client Authentication (1.3.6.1.5.5.7.3.2), Server Authentication (1.3.6.1.5.5.7.3.1)}
DnsNameList              : {ComputerFQDN}
SendAsTrustedIssuer      : False
Archived                 : False
EnhancedKeyUsage         : Document Encryption (1.3.6.1.4.1.311.80.1)
FriendlyName             : 
IssuerName               : 
NotAfter                 : 4/14/2018 1:09:37 PM
NotBefore                : 4/14/2017 1:09:37 PM
HasPrivateKey            : True
PrivateKey               : 
PublicKey                : RSA (2048 bits)
RawData                  : 
SerialNumber             : 19000000115FCB3C2E4C71BA69000000000011
SubjectName              : 
SignatureAlgorithm       : sha256RSA
Thumbprint               : F4238E74BFB238DEE89C78C13B5C2C8182674801
Version                  : 3
Handle                   : 1362382910512
Issuer                   : CA
Subject                  : CN=ComputerFQDN

问题主要与部分配置有关,我认为这是 Windows Server 2016 上 WMF 5.1 中的真正错误。

基本上,如果您有部分配置(推送或拉取无关紧要),并且其中一个配置函数不包含具有凭据的资源,因此强制使用 MOF 的证书序列化凭据, 解密会失败。

您可以使用 WMF 5.1 在 Windows Server 2016 或 Windows 10 上自行复制:

  1. 将名为 DscTest 的文件夹添加到 C:\Program Files\WindowsPowerShell\Modules 并将此 gist 中的文件添加到其中。

  2. 执行this脚本。前两个会通过,最后一个会失败。

解决方法是包含一个资源(即使它是虚拟资源),该资源对每个部分配置函数都使用凭据。这就是第一个要点中我的模块中的 DscCredentialHole 资源的用途。