PHP SOAP クライアントに WS-Security を実装しようとしています。最初のステップは、発信要求から有効な XML ダイジェストを生成できるようにすることですが、私はこれを行うことができませんでした。私は数日間答えを探していましたが、ほとんどの答えは「自分で解決しないで、既存の Java ライブラリを使用してください」のようなものになります。それは私の現在の状況では実現不可能です。
私はネット上で、同じダイジェストを再現しようとしている例をいくつか見てきました。たとえば、Microsoft からのものです。そのページには、次の例がリストされています。
<ds:Object Id="ts-text">
Wed Jun 4 12:11:06 EDT
</ds:Object>
次に、予想されるダイジェスト値を示します。
<ds:Reference URI="#ts-text">
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>pN3j2OeC0+/kCatpvy1dYfG1g68=</ds:DigestValue>
</ds:Reference>
これは、ダイジェスト値を計算するために使用してきたコードです。
<?php
$digest = base64_encode(hash('SHA1', $contents, true));
空白を削除するか、XML タグなしでタイムスタンプのみを使用するさまざまな組み合わせを試しましたが、成功しませんでした。正規化が必要な、より複雑な例も試しました。これは私のユニットテストの1つです:
public function testCreateDigest(DOMDocument $request, $expectedDigest) {
$ns = $request->documentElement->namespaceURI;
$body = $request
->getElementsByTagNameNS($ns, 'Body')
->item(0);
$firstElement = '';
foreach($body->childNodes as $node){
if ($node->nodeType === XML_ELEMENT_NODE) {
$firstElement = $node;
break;
}
}
$content = $firstElement->C14N(false, true);
$actualDigest = base64_encode(hash('SHA1', $content, true));
$this->assertEquals($expectedDigest, $actualDigest);
}
正確に何をハッシュする必要がありますか? 手順がありませんか?