Создание PasswordDigest для заголовка WS-Security в PowerShell - PullRequest
0 голосов
/ 20 февраля 2020

Я пытался отправить SOAP запрос с заголовком WS-Security с помощью PowerShell. После некоторого времени поиска в Интернете я нашел этот рабочий алгоритм в C#: Рабочий алгоритм для PasswordDigest в WS-Security

Я использовал его для создания некоторых рабочих функций PowerShell. Возможно, кому-то это понадобится.

<soapenv:Envelope xmlns:_v1="...." xmlns:_v4="...." xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
        <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <wsse:UsernameToken wsu:Id="UsernameToken-D07A6B31D33437D8A715821178065041">
                <wsse:Username>xxx</wsse:Username>
                <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">xxx</wsse:Password>
                <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">xxx</wsse:Nonce>
                <wsu:Created>xxx</wsu:Created>
            </wsse:UsernameToken>
        </wsse:Security>
        <wsa:Action>Koperta</wsa:Action>
   </soapenv:Header>
   <soapenv:Body>
      MESSAGE BODY
   </soapenv:Body>
</soapenv:Envelope>

SOAP запрос был сгенерирован SoapUI и сохранен в отдельном файле xml (soapMessage. xml).

Код для заполнения " Имя пользователя "," Пароль "," Одноразовый номер "и" Создан ":

function generateWsSecurityNonce() 
{
    $guid = [guid]::NewGuid().Guid
    $nonce = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($guid))
    return $nonce
}

function generateWsSecurityCreated() 
{
    return (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ")
}

function  generateWsSecurityPasswordDigest([string]$nonce, [string]$created, [string]$password) 
{
    $nonceBytes = [Convert]::FromBase64String($nonce)
    $createdBytes = [System.Text.Encoding]::UTF8.GetBytes($created)
    $passwordBytes = [System.Text.Encoding]::UTF8.GetBytes($password)
    $operand = $nonceBytes + $createdBytes + $passwordBytes;

    $sha1Hasher = New-Object System.Security.Cryptography.SHA1CryptoServiceProvider
    $hashedDataBytes = $sha1Hasher.ComputeHash($operand)
    return [Convert]::ToBase64String($hashedDataBytes)
}

$wsSecurityLogin = "login"
$wsSecurityPass = "pass"

$soap = [xml](Get-Content -Path ".\soapMessage.xml")
$soap.Envelope.Header.Security.UsernameToken.Username = $wsSecurityLogin
$soap.Envelope.Header.Security.UsernameToken.Nonce.InnerText =  generateWsSecurityNonce
$soap.Envelope.Header.Security.UsernameToken.Created =  generateWsSecurityCreated
$soap.Envelope.Header.Security.UsernameToken.Password.InnerText = generateWsSecurityPasswordDigest `
    $soap.Envelope.Header.Security.UsernameToken.Nonce.InnerText `
    $soap.Envelope.Header.Security.UsernameToken.Created `
    $wsSecurityPass

Отправка SOAP запроса находится вне этой области. Я показываю только генерацию значений заголовков WS-Security.

...