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 回目の呼び出しでのみ表示されますが、理由はまだわかりません ??