1

残念ながら、これをネイティブでサポートしていないサーバーから ws-security で保護された Web サービスを呼び出そうとしています。私が採用したアプローチは、ws-security 要素を含む要素を追加するプロセスで、実際のエンド ポイント URL へのリバース プロキシとして機能する .jsp を実装することです。

これは非常にうまく機能しているようで、正しい名前空間などを使用して XML を正しく構築したと確信しています。XML と SOAP-UI によって生成された XML を比較して、これを確認しました。

問題は、パスワード ダイジェスト ジェネレーターの実装にあります。NOnce、xsd:dateTime、パスワード、および次のコードに同じ入力を使用して SOAP-UI が行うことと同じ結果が得られません。

StringBuffer passwordDigestStr_ = new StringBuffer();

// First append the NOnce from the SOAP header
passwordDigestStr_.append(Base64.decode("PzlbwtWRpmFWjG0JRIRn7A=="));

// Then append the xsd:dateTime in UTC timezone
passwordDigestStr_.append("2012-06-09T18:41:03.640Z");

// Finally append the password/secret
passwordDigestStr_.append("password");

System.out.println("Generated password digest: " + new String(com.bea.xbean.util.Base64.encode(org.apache.commons.codec.digest.DigestUtils.sha(passwordDigestStr_.toString())), "UTF-8"));

問題は、 http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0.pdfで説明されているように、最初の 2 つの要素のハッシュを実装することにあると思います

ナンスは、デコードされた値のオクテット シーケンスを使用してハッシュされますが、タイムスタンプは、要素の内容で指定された UTF8 エンコーディングのオクテット シーケンスを使用してハッシュされることに注意してください。

誰かがこの問題を解決するのを手伝ってくれたら、それは素晴らしいことです。なぜなら、それは私を狂わせ始めているからです! ソースコードを提供していただけると理想的です。

4

2 に答える 2

9

SOAP-UI なしで試してみます。ハッシュ関数への入力は、文字列ではなくバイトであると想定されています。DigestUtils.sha()文字列を使用できますが、その文字列は適切にエンコードする必要があります。ナンスを書いたとき、あなたは呼び出しStringBuffer.append(Object)ていましたが、それが最終的に を呼び出しbyte[].toString()ます。のようなものが得られますが[B@3e25a5、間違いなくあなたが望むものではありません。どこでもバイトを使用することで、この問題を回避する必要があります。org.apache.commons.codec.binary.Base64以下の例では、使用していた Base64 クラスではなく、を使用していることに注意してください。関係ありません、それは私が手元に持っていたものです。

ByteBuffer buf = ByteBuffer.allocate(1000);
buf.put(Base64.decodeBase64("PzlbwtWRpmFWjG0JRIRn7A=="));
buf.put("2012-06-09T18:41:03.640Z".getBytes("UTF-8"));
buf.put("password".getBytes("UTF-8"));
byte[] toHash = new byte[buf.position()];
buf.rewind();
buf.get(toHash);
byte[] hash = DigestUtils.sha(toHash);
System.out.println("Generated password digest: " + Base64.encodeBase64String(hash));
于 2012-06-10T00:13:02.073 に答える
0

特に最初の迅速な対応を考慮して、返信が遅れたことをお詫びします。文字エンコーディングの問題を回避するために、アプローチの本質を使用してこれを機能させることができました。ただし、問題が発生したため、 を使用して組み合わせたjava.nio.ByteBufferbasic を使用するようにコードを変更しました。私が直面した問題は、「buf.position()」が適切なバイト数を返すにもかかわらず、挿入されたすべてのバイトが 0 だったことです。byte[]System.arrayCopy()java.nio.ByteBufferbyte[] toHashbuf.get(toHash)

ご協力ありがとうございました。

于 2012-07-26T10:00:25.337 に答える