PowerShell DSC. Сертификат для шифрования пароля
При использовании учетных записей в PowerShell DSC для обеспечения безопасности необходимо шифровать пароль сертификатом. В это посте о том как получить валидный сертификат, подходящий для этого.

Невалидный сертификат
Если сертификат не удовлетворяет требованиям для шифрования пароля, то при попытке скомпилировать конфигурацию получаем примерно такое исключение:
ConvertTo-MOFInstance : System.ArgumentException error processing property 'Password' OF TYPE 'MSFT_Credential': Certificate 
'4B73573487D6017136355FAA9A2AF7F9B59A16F8' cannot be used for encryption. Encryption certificates must contain the Data Encipherment 
or Key Encipherment key usage, and include the Document Encryption Enhanced Key Usage (1.3.6.1.4.1.311.80.1).
At C:\Windows\system32\WindowsPowerShell\v1.0\Modules\PSDesiredStateConfiguration\PSDesiredStateConfiguration.psm1:303 char:13
    +             ConvertTo-MOFInstance MSFT_Credential $newValue
    +             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Write-Error], InvalidOperationException
    + FullyQualifiedErrorId : FailToProcessProperty,ConvertTo-MOFInstance
Генерация сертификата
Для запроса сертификата можно использовать Certreq, который в качестве входного параметра принимает файл-запрос. Для PowerShell DSC достаточно примерно такого запроса:
[Version]
Signature = "$Windows NT$"
[Strings]
szOID_ENHANCED_KEY_USAGE = "2.5.29.37"
szOID_DOCUMENT_ENCRYPTION = "1.3.6.1.4.1.311.80.1"
[NewRequest]
Subject = "CN=COMPUTER_NAME"
KeyLength = 2048
MachineKeySet = true
RequestType = Cert
KeySpec = AT_KEYEXCHANGE
KeyUsage = CERT_KEY_ENCIPHERMENT_KEY_USAGE
[Extensions]
%szOID_ENHANCED_KEY_USAGE% = "{text}%szOID_DOCUMENT_ENCRYPTION%"
Теперь простой PowerShell генерирует сертификат:
certreq -new PathCertificateToRequest.inf PathToCertificate.cer
Полученный файл можно использовать для шифрования пароля в PowerShell DSC.
Конфигурация
Указанный сертификат необходимо указать в конфигурации Local Configuration Manager для каждого сервера, где это применимо. В противном случае получаем исключение при, например, вызове Start-DscConfiguration:
The Local Configuration Manager is not configured with a certificate.
Чтобы указать сертификат, который необходимо использовать, достаточно добавить блок LocalConfigurationManager в конфигурацию. Примерно так:
Configuration CertConfigurationDemo {
    param(
        [Parameter(Mandatory=$true)] [ValidateNotNullorEmpty()] [PSCredential] $InstallAccount
    )
 
    Node SP2016SRV
    {
        <strong>LocalConfigurationManager {</strong>
            <strong>CertificateID = $Node.Thumbprint</strong>
        <strong>}</strong>
        #Someting resource using #InstallAccount
    }
}
$ConfigData = @{
    AllNodes = @(
        @{
            NodeName = 'SP2016SRV'
            CertificateFile = 'C:\sp\localhost.cer'
            Thumbprint = '35024c5060014373e768b900b762f6793c5575d9'
            PSDscAllowDomainUser = $true
        }
    )
}
Ссылки
Немного полезных ссылок по теме:
Use a certificate with PowerShell DSC to add a server to Active Directory without hard coding a password - этот способ у меня не сработал.
Encryption certificates must contain Data Encipherment or Key Encipherment
Пользуемся.
 






















































































