2

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);

}

正確に何をハッシュする必要がありますか? 手順がありませんか?

4

1 に答える 1

2

解決策を見つけました。私が試したほとんどの例では、必要な変換はコメント付きの排他的正規化でした: http://www.w3.org/TR/2002/REC-xml-exc-c14n-20020718/#WithComments

だから私の問題は、私が間違った変換をしていたことでした。PHP の C14N 関数の最初のパラメーターは、排他的変換を使用するかどうかを定義します。これが本来あるべきコードです (最初の要素への不要なトラバーサルを削除したことに注意してください)。

public function testCreateDigest(DOMDocument $request, $expectedDigest) {

    $ns = $request->documentElement->namespaceURI;
    $body = $request
        ->getElementsByTagNameNS($ns, 'Body')
        ->item(0);

    $content = $body->C14N(true, true); // <-- exclusive, with comments

    $actualDigest = base64_encode(hash('SHA1', $content, true));

    $this->assertEquals($expectedDigest, $actualDigest);

}

それで、あなたはそれを持っています。これは、あてもなくコーディングを始める前に、自分の XML を再確認し、標準を理解することを思い出させるものでした。

于 2013-09-18T03:59:50.593 に答える