1

wss4j を使用してサーバー上の SOAP 要求のセキュリティを検証しているときに問題が発生しました。これは、SOAP 要求のセキュリティ ヘッダーを検証するために使用するコードの一部です (SOAPHandler の handleMessage メソッドにいます)。実装) :

// get the crypto file to retrieve dedicated certificate
final Crypto iCertificateStore = WSKeystoreManagement.getCryptoFile();
final WSSecurityEngine iEngine = new WSSecurityEngine();
// Add the default config file to the engine
final WSSConfig iConfig = WSSConfig.getNewInstance();
iEngine.setWssConfig(iConfig);

try {

  // check security header
  final List<WSSecurityEngineResult> iSecurityParts =
    iEngine.processSecurityHeader(aDocument, null, null, iCertificateStore);


} catch (final WSSecurityException iException) { ...}

要求には署名とタイムスタンプがあります。最初に Web サービスを呼び出すと、すべてが正常に行われ、要求が処理されます。小さな Java プロジェクトを使用して Web サービスを呼び出し、プログラムが応答を取得して、正しく終了します。しかし、プログラムを再度起動しましたが、今回はサーバー側でチェックが機能しません。問題の原因を確認するために wss4j コードを調べてきました。DOMReference.validate メソッドでここにたどり着きました。

        if (validateContext == null) {
        throw new NullPointerException("validateContext cannot be null");
    }
    if (validated) {
        return validationStatus;
    }
    Data data = dereference(validateContext);
    calcDigestValue = transform(data, validateContext);

    if (log.isDebugEnabled()) {
        log.debug("Expected digest: " + Base64.encode(digestValue));
        log.debug("Actual digest: " + Base64.encode(calcDigestValue));
    }

今回は calcDigestValue が異なり、理由がわかりません... 誰かそれについて何か知っていますか?

ありがとう。

編集:私は研究を進めてきましたが、問題は、リクエストエンベロープの本文がクライアントとサーバーの間のどこかで変更されているという事実に起因しています...クライアントを確認しましたが、本文はほぼ確実ですそこでは変更されません。これらの変更は 2 回目の呼び出しでのみ表示されますが、理由はまだわかりません ??

4

1 に答える 1

0

問題を最終的に発見しました。クライアント側とサーバー側で使用していたオブジェクトに違いがあり (理由は聞かないでください)、サーバー側のトランスポート層がエンベロープを取得していたときに、それらに名前空間を配置していました。署名でダイジェスト チェックが失敗する原因となるボディ内のオブジェクト。

于 2013-02-27T15:59:46.087 に答える