2015-10-22 10 views
6

PHPで実装されたSOAPサーバーでSOAPリクエストの署名を検証したいと思います。WS *サーバの実装で署名を確認する

サーバコード:

$Server = new SoapServer(); 

$d = new DOMDocument(); 
$d->load('php://input'); 

$s = new WSSESoapServer($d); 
try { 
    if($s->process()) { 
     // Valid signature 
     $Server->handle($s->saveXML()); 
    } else { 
     throw new Exception('Invalid signature'); 
    } 
} catch (Exception $e) { 
    echo "server exception: " . $e; 
} 

エラー:私はこのライブラリを使用してSOAPリクエストに署名するクライアントを実装している

exception 'Exception' with message 'Error loading key to handle Signature' in /<path>/wse/src/WSSESoapServer.php:146 

https://github.com/robrichards/wse-php。サーバーを実装する方法の例はありません。

署名を確認するために公開鍵をロードするにはどうすればよいですか?

[編集] 署名を検証するときに、私は今

$key = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array('type' => 'public')); 
    $key->loadKey(CERT, true); 

を使用して供給し、キーをロードすることができた私は、もはやエラーメッセージを取得しています:

$x = new XMLSecurityDSig(); 
$d = $x->locateSignature($soapDoc); 
$valid = $x->verify($key); 

しかし、$有効常にfalseです。キーが間違って読み込まれているか、実際に無効であるかどうかはわかりません。 PHPを使用したSOAPサーバーの実装に関する情報はほとんどなく、署名付きのリクエストのチェックに依存するSOAPサーバーの実装に関する情報はありません。

明確化

  1. 私のクライアントは、リモートのWebサービスに協議し、承認を取得します。

  2. リモートサーバーが要求を処理するまでに時間がかかります。

  3. リモートクライアント(私は制御できません)は、 私のサービスに要求します。

私はトラブル署名

+0

WSSESoapServerはSOAPメッセージ内のシグネチャを自動的に検出して検証するようです。したがって、最初のアプローチは大丈夫です。手動でキーをロードしたり、確認する必要はありません。しかし、WSSESoapServerでは、署名されたSOAPメッセージに署名と、署名を検証するための公開鍵が含まれている必要があります。 – smat88dd

+0

あなたはまだ解決策に興味がありますか、それとも自分で修復できますか?私はテスト用のクライアントとサーバーをセットアップし、それを回答として掲示することができました!とにかく、私はそれを実行することができます、wsseサーバーは、エラーなしで署名を検証しています。 – smat88dd

+0

@ smat88dd私は私の最後の編集が署名を読み込むことによってそれを修正したと思う。私は依頼をしているクライアントを支配していません。私が持っている公開鍵は、常にfalseと評価されるため、無効である可能性があります。あなたの解決策が私と違うなら、私はまだそれを見たいと思うでしょう。参照する* *ドキュメントがある場合のみ。 – soulfreshner

答えて

0

まあとにかくの検証を持っているところ最後のステップは、あなたの最初のアプローチは、私のサーバーは、同じ構造を有している、私には正常に見えます。残念ながら、WSSESoapServerはSoapServerから継承されないため、ではなくが実際にSoapServerではなくSoapSignatureValidatorであり、のように呼び出す必要があります。別のSoapServerインスタンス(透過的かつ自動的に)を必要としないように、その動作を修正することは容易に可能である。

<?php 
require 'soap-server-wsse.php'; 

try { 
    // get soap message 
    $xmlSoap = DOMDocument::load('php://input'); 

    // validate signature 
    $validateSignature = new WSSESoapServer($xmlSoap); 
    if(!$validateSignature->process()) 
     file_put_contents("log.txt", "soapserver: SIGNATURE VALIDATION ERROR - CONTINUING WITHOUT SIGNATURE\n", FILE_APPEND); 
     //throw new Exception('Invalid Signature'); # this would cancel the execution and not send an answer 

    $sServer = new SoapServer($wsdl); 
    // actually process the soap message and create & send answer 
    //$sServer->setClass() or setObject() or set setFunction() 
    $sServer->handle($validateSignature->saveXML()); 
} catch (Exception $fault) { 
    file_put_contents("log.txt", "soapserver soapfault: ".print_r($fault, true), FILE_APPEND); 
} 
?> 
+0

ああ、btw - このコードは実際には動作しますが、署名の公開鍵がsoapメッセージに含まれている場合のみです。公開鍵を自分自身で提供したい場合は、 'WSSESoapServer'への変更が必要です。 – smat88dd

+0

しかし、これは全く質問に答えません。私の全問題は、署名をチェックするために公開鍵をロードすることです。どのような変更が必要ですか?しかし、助けてくれてありがとう。少なくとも私は正しい軌道に乗っていることがわかります – soulfreshner

+0

申し訳ありませんが、わかりました:WSSESoapServerに公開鍵をロードするオプションはありません。石鹸のメッセージの中からキーを取得するように作られています。 WSSESoapServerを使用してサーバーを作成する方法を尋ねてきたので、私の答えはほんの一部に過ぎませんでした。 – smat88dd