Проблема при установке сертификата привязки IIS в Powershell
Я пишу сценарий Powershell, чтобы просмотреть список привязок IIS, найти любой, у которого есть специальный "старый" отпечаток cert, и заменить их сертификаты сертификатом, который имеет "новый" отпечаток. Это значит, что я могу обновить сертификат для многих привязок, потому что мы используем один и тот же сертификат для большого количества сайтов, поэтому нам нужно обновить все привязки, которые имеют старый сертификат для нового сертификата. Вот что я придумал:
##### 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
Оказывается, у меня была такая же проблема, как описано здесь (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
}