Проблема при настройке сертификата привязки IIS в Powershell - PullRequest
0 голосов
/ 07 июня 2018

Я пишу сценарий Powershell, чтобы просмотреть список привязок IIS, найти все, у которых есть определенный «старый» отпечаток сертификата, и заменить их на сертификат с «новым» отпечатком.Это позволяет мне обновлять сертификат для многих привязок, потому что мы используем один и тот же сертификат для многих сайтов, поэтому нам нужно обновить все привязки, которые имеют старый сертификат, на новый сертификат.Вот что я придумал:

##### EDIT THESE VARIABLES #####
$SiteName = "movc-website-www"
$OldCertThumbprint = "‎76 ae 0b 2e b9 f7 45 ce 27 c4 02 6e 90 66 62 93 69 d7 5e 4c"
$ReplacementCertThumbprint = "‎7f fa 9f f3 90 b8 a2 d8 4c 98 51 47 a5 64 1d 90 f6 2f ca 73"

##### FUNCTIONS #####
Function ReplaceWebsiteBinding {
    Param(
        [string] $SiteName,
        [string] $OldCertThumbprint,
        [string] $ReplacementCertThumbprint
    );

    Import-Module WebAdministration;

    $ReplacedCount = 0

    $IISBindings = (Get-ItemProperty -Path "IIS:\Sites\$SiteName" -Name Bindings)
    for ($i=0; $i -lt ($IISBindings.Collection).Length; $i++) {
        if (($IISBindings.Collection[$i]).certificateHash -eq $OldCertThumbprint) {
            ($IISBindings.Collection[$i]).RebindSslCertificate($ReplacementCertThumbprint, "My")
            $ReplacedCount++
        }
    }

    Return $ReplacedCount
}

##### MAIN PROGRAM #####
$OldCertThumbprint = $OldCertThumbprint.Replace(" ", "").ToUpper()
$ReplacementCertThumbprint = $ReplacementCertThumbprint.Replace(" ", "").ToUpper()

# Check that cert with given thumbprints exist
$FoundCert = Get-ChildItem -Path Cert:\LocalMachine\My |
    Where-Object { $_.Thumbprint -eq $OldCertThumbprint } |
    Select-Object -ExpandProperty Thumbprint
if (!$FoundCert) {
    Write-Host "Old cert with thumbprint $OldCertThumbprint not found!"
    Exit
}

$FoundCert = Get-ChildItem -Path Cert:\LocalMachine\My |
    Where-Object { $_.Thumbprint -eq $ReplacementCertThumbprint } |
    Select-Object -ExpandProperty Thumbprint

if (!$FoundCert) {
    Write-Host "Replacement cert with thumbprint $ReplacementCertThumbprint not found!"
    Exit
}

# Associate new cert with bindings that have old cert
$ReplacedCount = ReplaceWebsiteBinding $SiteName $OldCertThumbprint $ReplacementCertThumbprint

Write-Host "Replaced $ReplacedCount binding(s)."

Проблема в том, что это не работает, потому что строка, вызывающая .RebindSslCertificate(...), выдает мне следующую ошибку Powershell:

Value does not fall within the expected range.
At (...)
+             ($IISBindings.Collection[$i]).RebindSslCertificate($Repla ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], ArgumentException
    + FullyQualifiedErrorId : System.ArgumentException

Несамая полезная ошибка на самом деле, и я не могу понять, почему я ее получаю.Аргументы выглядят хорошо для меня;отпечаток был найден кодом Get-ChildItem, и «Мой» выглядит хорошо.Единственное, о чем я могу думать, это то, что он может искать в текущем хранилище сертификатов пользователя, а не в хранилище сертификатов локального компьютера, где находятся нужные сертификаты.Может кто-нибудь помочь мне с тем, почему эта ошибка происходит?

1 Ответ

0 голосов
/ 11 июня 2018

Оказывается, у меня возникла та же проблема, что и описанная здесь (RebindSslCertificate сертификат - это то же самое, что удалить его и затем вызвать AddSslCertificate).При копировании отпечатка из диалогового окна сертификата в Windows по какой-то глупой причине он вставляет символ LTR нулевой ширины в начало строки, чтобы мой отпечаток был недействительным.Я добавил проверку для этого в начале моего сценария, чтобы предотвратить это:

if ($OldCertThumbprint -match "[\W-[\ ]]") {
    Write-Host "Old cert thumbprint contains non-word characters, maybe a zero-width LTR Unicode character at the beginning.  You almost certainly don't want this!  Aborting!"
    Exit
}
if ($ReplacementCertThumbprint -match "[\W-[\ ]]") {
    Write-Host "Replacement cert thumbprint contains non-word characters, maybe a zero-width LTR Unicode character at the beginning.  You almost certainly don't want this!  Aborting!"
    Exit
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...