Я пытался отправить 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.