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サーバーの実装に関する情報はありません。
明確化
私のクライアントは、リモートのWebサービスに協議し、承認を取得します。
リモートサーバーが要求を処理するまでに時間がかかります。
リモートクライアント(私は制御できません)は、 私のサービスに要求します。
私はトラブル署名
WSSESoapServerはSOAPメッセージ内のシグネチャを自動的に検出して検証するようです。したがって、最初のアプローチは大丈夫です。手動でキーをロードしたり、確認する必要はありません。しかし、WSSESoapServerでは、署名されたSOAPメッセージに署名と、署名を検証するための公開鍵が含まれている必要があります。 – smat88dd
あなたはまだ解決策に興味がありますか、それとも自分で修復できますか?私はテスト用のクライアントとサーバーをセットアップし、それを回答として掲示することができました!とにかく、私はそれを実行することができます、wsseサーバーは、エラーなしで署名を検証しています。 – smat88dd
@ smat88dd私は私の最後の編集が署名を読み込むことによってそれを修正したと思う。私は依頼をしているクライアントを支配していません。私が持っている公開鍵は、常にfalseと評価されるため、無効である可能性があります。あなたの解決策が私と違うなら、私はまだそれを見たいと思うでしょう。参照する* *ドキュメントがある場合のみ。 – soulfreshner