WSSE認証用のヘッダ文字列を生成するスクリプト

はてなブックマークAtomAPIを利用するためにはWSSE認証を使用するらしいので、PowerShellからWSSE認証を行うためのスクリプトを作った。

Get-WsseHeader.ps1

param([string]$userName, [string]$password)

if($userName.Length -eq 0 -or $password.Length -eq 0 -or $args[0] -eq "-?") {
    $commandName = [IO.Path]::GetFileNameWithoutExtension($MyInvocation.MyCommand.Name)
    Write-Host -foregroundColor Yellow @"

Name:
    $commandName

Description:
    指定したユーザ名とパスワードからWSSE認証用のヘッダ文字列を取得します。

Usage:
    $commandName [[-userName] <string>] [[-password] <string>]
    
    -userName <string>
        ユーザ名
        
    -password <string>
        パスワード
    
"@
    exit 1
}
# セキュリティトークン
$nonce = New-Object byte[] 8
(New-Object Random).NextBytes($nonce)

# 現在の日付 - ISO-8601表記
$created = [DateTime]::Now.ToString("yyyy-MM-ddTHH:mm:ssZ")

# セキュリティトークン、現在の日付、パスワードを連結して、SHA1アルゴリズムでダイジェスト化する。
$passwordDigest = [Text.Encoding]::UTF8.GetBytes($created + $password)
$buf = New-Object byte[] ($nonce.Length + $passwordDigest.Length)
[Array]::Copy($nonce, $buf, $nonce.Length)
[Array]::Copy($passwordDigest, 0, $buf, $nonce.Length, $passwordDigest.Length)
$passwordDigest = (New-Object Security.Cryptography.SHA1CryptoServiceProvider).ComputeHash($buf)

# Base64エンコードする必要あり
$nonce = [Convert]::ToBase64String($nonce)
$passwordDigest = [Convert]::ToBase64String($passwordDigest)
# ヘッダ文字列
"UsernameToken Username=`"$userName`", PasswordDigest=`"$passwordDigest`", Nonce=`"$nonce`", Created=`"$created`"

使い方

$webReq = New-Object [Net.HttpWebRequest]::Create("url")
$webReq.Headers.Add("X-WSSE", (Get-WsseHeader "ユーザ名" "パスワード"))
# do something