Web サービスにカスタム署名を使用しようとしています。アイデアは、カスタム署名を作成/検証するハンドラーをサーバーとクライアント側に追加することです。全体に署名する必要があると仮定します。
問題は、SOAP リクエストを受信した後に、 JAX WS サーバー側が (名前空間宣言を追加/繰り返すことによって) を変更することです。
以下は、サーバー側で TCP/IP モニターによってキャプチャされた単純化された SOAP 要求です。
<?xml version="1.0" standalone="no"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:getServerName xmlns:ns2="http://ws.example.com/">
<arg0>someText</arg0>
</ns2:getServerName>
</S:Body>
</S:Envelope>
サーバー側でアクティブなハンドラーは 1 つだけで、最初のアクションは整形式の出力です。
public boolean handleMessage(SOAPMessageContext context) {
try {
SOAPMessage soapMsg = context.getMessage();
SOAPEnvelope soapEnv = soapMsg.getSOAPPart().getEnvelope();
nodeToPrettyFormat(soapEnv, null); //just a System.out in pretty format
結果の出力は次のとおりです。
<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header/>
<S:Body>
<ns2:getServerName
xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://ws.example.com/">
<arg0>someText</arg0>
</ns2:getServerName>
</S:Body>
</S:Envelope>
ご覧のとおり、要素の xmlns:S="http://schemas.xmlsoap.org/soap/envelope/ が複製されています。これにより、要素を含むすべての署名が無効になります。
そう、
- なぜこうなった?
- それは防ぐことができますか?
- (一般的に) カスタム署名を適用するより良いアイデアはありますか?
ありがとうございました。