Вызов Powershell Invoke-RestMethod с использованием сертификата магазина Windows (базовая авторизация?)
Я хотел бы вызвать удаленный веб-сервис Rest с сервера Windows, на котором размещен удаленный сертификат. Я экспортировал сертификат с удаленного сервера и добавил его в хранилище Windwos. (/Personal/myCert)
Я хотел бы использовать его в команде PowerShell Invoke-RestMethod. Ниже приведен код, который я пробовал
# Variables
$Remote_Uri = "https://remote.example.com/service/search"
$Remote_CertificateName = "myCert"
$Remote_ApiKey = "oisdjfSOEDJFKQDfSDKFjsQDKFJ"
$Remote_ContentType = "application/json"
$LocalArtifactPath = "C:\RemoteObjects.json"
# Get Certificate
$Remote_CertificateThumbprint = (Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.Subject -match $Remote_CertificateName}).Thumbprint;
$Certificate = Get-ChildItem -Path Cert:\LocalMachine\My\$Remote_CertificateThumbprint
# Basic Encoding
$encoding = [System.Text.Encoding]::ASCII.GetBytes($Certificate)
$encodedString = [System.Convert]::ToBase64String($encoding)
$BasicAuth = "Basic " + $encodedString
# Set Headers
$Headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$Headers.Add("Authorization", $BasicAuth)
$Headers.Add("api", $Remote_ApiKey)
$Headers.Add("Content-Type", $Remote_ContentType)
# Self-signed certificate
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }
# Call Rest Service
Invoke-RestMethod -Method Get -Uri $Remote_Uri -OutFile $LocalArtifactPath -Headers $Headers
Invoke-RestMethod -Method Get -Uri $Remote_Uri -OutFile $LocalArtifactPath -Certificate $Certificate
Invoke-RestMethod -Method Get -Uri $Remote_Uri -OutFile $LocalArtifactPath -CertificateThumbprint $Remote_CertificateThumbprint
# Self-signed certificate off
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = $null
Три строки с Invoke-RestMethod
Команды потерпели неудачу с соответственно:
- Неверный заголовок (это ожидалось, но я попробовал)
- Авторизация пуста или схема не является базовой
- Отпечаток сертификата не найден
У меня есть остальные, работающие с @{"AUTHORIZATION"="Basic Base64Encode(user:pass)"}
поэтому я могу сказать, что служба отвечает, но я бы не хотел использовать user: pass в моем скрипте.
Я хотел бы использовать сертификат, который я добавил в Магазин Windows. Мне интересно о двух вещах:
- Является ли "Базовая" схема авторизации подходящей для использования с сертификатом?
- В PowerShell, как использовать сертификат из локального магазина Windows с помощью команды Invoke-RestMethod?
Спасибо за помощь
1 ответ
Добавление этого [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
в моем скрипте исправлена проблема "Базовое соединение было закрыто".
Перед этой перекрестной проверкой включается ли IIS в вашей системе.