Sie können SAML-Token mit der Subjektbestätigungsmethode Sender-Vouches von einem externen
Sicherheitstokenservice (STS) anfordern.
Die angeforderten SAML-Sender-Vouches-Token können Sie in Web-Service-Anforderungsnachrichten über das Programmiermodell
Java™ API for XML-Based Web Services (JAX-WS)
und WSS-APIs (Web Services Security APIs) mit Transportschutz senden.
Vorbereitende Schritte
Für diese Task müssen Sie mit dem Programmiermodell JAX-WS, den WSS-APIs, mit SAML-Konzepten, mit dem SSL-Transportschutz
sowie mit Richtliniensätzen zum Konfigurieren und Verwalten von Web-Service-Einstellungen vertraut sein.
Informationen zu diesem Vorgang
Sie können ein
SAML-Token mit der Subjektbestätigungsmethode Sender-Vouches von einem externen STS
anfordern und dieses dann in Web-Service-Anforderungsnachrichten von einem Web-Service-Client aus über WSS-APIs mit Transportschutz
senden.
Die für diese Task verwendete Web-Service-Clientanwendung ist eine modifizierte Version des
Clientcodes in der Beispielanwendung JaxWSServicesSamples, die zum Download verfügbar ist. In der Prozedur sind Codeauszüge des Beispiels beschrieben. Außerdem wird ein
vollständiger, sofort einsatzfähiger Beispiel-Web-Service-Client bereitgestellt.
Vorgehensweise
- Ermitteln Sie den Web-Service-Client, mit dem Sie einen Web-Service-Provider aufrufen möchten, und fordern Sie diesen Client an.
Fügen Sie mit diesem Client über WSS-APIs
programmgestützt SAML-Token in SOAP-Anforderungsnachrichten ein.
Der in dieser Prozedur verwendete Web-Service-Client ist eine modifizierte Version des
Clientcodes, der in der Web-Service-Beispielanwendung JaxWSServicesSamples enthalten ist.
Führen Sie die folgenden Schritte aus, um den Beispiel-Web-Service-Client anzufordern und über WSS-APIs zu modifizieren, um
SAML-Sender-Vouches-Token programmgesteuert in SOAP-Anforderungsnachrichten übergeben zu können:
- Laden Sie die Beispielanwendung JaxWSServicesSamples herunter. Das Beispiel JaxWSServicesSamples ist standardmäßig nicht installiert.
- Fordern Sie den Clientcode für JaxWSServicesSamples an.
Zu Demonstrationszwecken verwendet diese Prozedur eine modifizierte Version des
Thin-Client-Beispiels Echo, das
Teil des Beispiels JaxWSServicesSamples ist.
Die Datei SampleClient.java des Web Services Thin Client "Echo"
befindet sich im Verzeichnis src\SampleClientSei\src\com\ibm\was\wssample\sei\cli.
Die Beispielklassendatei ist in der Datei WSSampleClientSei.jar enthalten.
Die Unternehmensanwendung
JaxWSServicesSamples.ear und die unterstützenden JAR-Dateien (Java-Archiv)
befinden sich im Verzeichnis installableApps in der Beispielanwendung
"JaxWSServicesSamples".
- Implementieren Sie die Datei JaxWSServicesSamples.ear auf dem Anwendungsserver. Nachdem Sie die Datei JaxWSServicesSamples.ear implementiert haben, können Sie den Code des Beispiel-Web-Service-Clients
anhand der Beispielanwendung testen.
Anstatt den Beispiel-Web-Service-Client zu verwenden, können Sie auch die Codefragmente hinzufügen, um in Ihrer eigenen Web-Service-Clientanwendung
SAML-Token über WSS-APIs programmgestützt in SOAP-Anforderungsnachrichten zu übergeben. Das Beispiel in dieser Prozedur nutzt einen Web Services Thin Client für JAX-WS.
Sie können aber auch einen verwalteten Client verwenden.
- Erstellen Sie eine Kopie des Standardrichtliniensatzes SAML20 Bearer WSHTTPS oder
the SAML11 Bearer WSHTTPS.
Geben Sie einen Namen für die Kopie des Richtliniensatzes an, z. B.
SAML20 SenderVouches
WSHTTPS oder SAML11 SenderVouches WSHTTPS, damit Sie leichter erkennen können, dass dieser neue Richtliniensatz
die Bestätigungsmethode Sender-Vouches verwendet.
Weitere Änderungen an der neuen Richtliniendatei sind nicht erforderlich, weil die Subjektbestätigungsmethode
in der Bindungskonfiguration und nicht in der Richtlinie angegeben wird.
Die neue Richtliniendatei enthält die Richtlinien-ID SAMLToken20Bearer
oder SAMLToken11Bearer. Ändern Sie die ID der
Richtlinie SAMLToken20Bearer auf SAMLToken20SV oder die ID der Richtlinie
SAMLToken11Bearer auf SAMLToken11SV, um einen wirklich beschreibenden Namen
zu erhalten. Wenn Sie die ID der Richtlinie ändern, wird die Richtliniendurchsetzung davon nicht beeinflusst.
Durch das Hinzufügen einer beschreibenden Kennung können Sie jedoch leichter erkennen, dass die Richtlinien mit einer solchen Kennung
die Bestätigungsmethode Sender-Vouches verwenden.
Sie können die Einstellungen dieser Richtlinien anzeigen. Führen Sie dazu die folgenden Schritte in der Administrationskonsole aus:
- Klicken Sie auf .
- Klicken Sie in der Tabelle mit den Richtlinien auf die
Richtlinie WS-Security.
- Klicken Sie auf den Link Hauptrichtlinie oder auf den Link Bootstraprichtlinie.
- Klicken Sie im Abschnitt "Richtliniendetails" auf Richtlinien für Anforderungstoken.
- Ordnen Sie den neuen Richtliniensatz SAML20 SenderVouches WSHTTPS oder SAML11 SenderVouches
WSHTTPS der Web-Service-Provideranwendung zu. Lesen Sie hier, wie die Client- und Providerbindungen für das
SAML-Sender-Vouches-Token konfiguriert werden, und erfahren Sie, wie dieser Richtliniensatz Ihrer Web-Service-Provideranwendung zugeordnet
wird.
- Erstellen Sie eine Kopie der allgemeinen Standardbindungen von "SAML Bearer Provider sample".
- Geben Sie für die neue Kopie des Standardrichtliniensatzes einen Namen an, der "sender-vouches" enthält, z. B.
SAML-Sender-Vouches-Providerbindung.
- Ändern Sie im Callback-Handler Ihres SAML11- oder SAML20-Tokenkonsumenten
in der Tokenkonsumentenkonfiguration für die vorgesehene SAML-Tokenversion den Wert der Eigenschaft "confirmationMethod" in sender-vouches. Stellen Sie sicher, dass die angepassten Eigenschaften trustStoreType, trustStorePassword
und trustStorePath dem Truststore mit dem STS-Unterzeichnerzertifikat entsprechen. Lesen Sie hier, wie die Client- und Providerbindungen für das
SAML-Sender-Vouches-Token konfiguriert werden, und erfahren Sie, wie die Sender-Vouches-Bindungen modifiziert werden müssen, um der Bestätigungsanforderung gerecht zu werden.
- Weisen Sie die neue Providerbindung dem Providerbeispiel JaxWSServicesSamples
zu. Lesen Sie hier, wie die Client- und Providerbindungen für
SAML-Sender-Vouches konfiguriert werden, und erfahren Sie, wie die allgemeinen Standardbindungen des SAML-Sender-Vouches-Providerbeispiels Ihrer Web-Service-Provideranwendung zugeordnet
werden.
- Aktivieren Sie das SSL-Konfigurationsattribut
clientAuthentication des Web-Services-Providers, damit die Clientauthentifizierung mit X.509-Zertifikaten angefordert wird.
Das Attribut "clientAuthentication" bestimmt, ob die SSL-Clientauthentifizierung erforderlich
ist. Gehen Sie in der Administrationskonsole wie folgt vor, um das Attribut clientAuthentication
anzugeben:
- Klicken Sie auf .
- Klicken Sie in der Topologie für eingehende Daten auf den Link WC_defaulthost_secure.
- Klicken Sie unter "Zugehörige Elemente" auf den Link SSL-Konfigurationen.
- Wählen Sie die Ressource NodeDefaultSSLSettings aus.
- Klicken Sie auf den Link Einstellungen für Datenschutzniveau.
- Wälen Sie im Menü Erforderlich aus, um die Clientauthentifizierung anzugeben.
Informieren Sie sich hier, wie eine Secure-Sockets-Layer-Konfiguration erstellt wird und wie das Attribut
clientAuthentication konfiguriert werden kann.
- Geben Sie an, dass der SSL-Nachrichtenschutz auf Transportebene verwendet werden soll. Geben Sie mit der folgenden JVM-Eigenschaft an, dass die
SAML-Tokenanforderung beim STS mit SSL geschützt werden soll:
-Dcom.ibm.SSL.ConfigURL=file:Profilstammverzeichnis\properties\ssl.client.props
Alternativ können Sie mit einer
Java-Systemeigenschaft im Beispielclientcode die SSL-Konfigurationsdatei definieren,
z. B. System.setProperty("com.ibm.SSL.ConfigURL", "file:Profilstammverzeichnis/properties/ssl.client.props");
- Fügen Sie die JAR-Datei des Thin Client für JAX-WS zum Klassenpfad hinzu. Fügen Sie die Datei Stammverzeichnis_des_Anwendungsservers/runtimes/com.ibm.jaxws.thinclient_8.5.0.jar
zum Klassenpfad hinzu. Lesen Sie die Informationen zum Testen von Clients mit Unterstützung für Web Services, um zu erfahren, wie diese JAR-Datei
zum Klassenpfad hinzugefügt wird.
- Fordern Sie das SAML-Token von einem externen STS an. Das folgende Codefragment veranschaulicht die Anforderung des
SAML-Sender-Vouches-Tokens. Hierbei wird vorausgesetzt, dass ein externer STS so konfiguriert ist, dass er
ein Benutzernamenstoken akzeptiert und nach der Validierung ein
SAML-1.1-Token mit Sender-Vouches ausstellt.
// SAML-Token von externem STS anfordern
WSSFactory factory = WSSFactory.getInstance();
String STS_URI = "https://externalstsserverurl:port/TrustServerWST13/services/RequestSecurityToken";
String ENDPOINT_URL = "http://localhost:9080/WSSampleSei/EchoService";
WSSGenerationContext gencont1 = factory.newWSSGenerationContext();
WSSConsumingContext concont1 = factory.newWSSConsumingContext();
HashMap<Object, Object> cbackMap1 = new HashMap<Object, Object>();
cbackMap1.put(SamlConstants.STS_ADDRESS, STS_URI);
cbackMap1.put(SamlConstants.SAML_APPLIES_TO, ENDPOINT_URL);
cbackMap1.put(SamlConstants.TRUST_CLIENT_WSTRUST_NAMESPACE, "http://docs.oasis-open.org/ws-sx/ws-trust/200512");
cbackMap1.put(SamlConstants.TRUST_CLIENT_COLLECTION_REQUEST, "false");
cbackMap1.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML11_VALUE_TYPE);
cbackMap1.put(SamlConstants.CONFIRMATION_METHOD, "sender-vouches");
SAMLGenerateCallbackHandler cbHandler1 = new SAMLGenerateCallbackHandler(cbackMap1);
// UNT zur Trust-Anforderung hinzufügen
UNTGenerateCallbackHandler utCallbackHandler = new UNTGenerateCallbackHandler("testuser", "testuserpwd");
SecurityToken ut = factory.newSecurityToken(UsernameToken.class, utCallbackHandler);
gencont1.add(ut);
cbHandler1.setWSSConsumingContextForTrustClient(concont1);
cbHandler1.setWSSGenerationContextForTrustClient(gencont1);
SecurityToken samlToken = factory.newSecurityToken(SAMLToken.class, cbHandler1, "system.wss.generate.saml");
System.out.println("SAMLToken id = " + samlToken.getId());
- Geben Sie mit der Methode WSSFactory newSecurityToken an, wie das SAML-Token von einem externen STS angefordert werden soll.
Geben Sie folgende Methode an, um das SAML-Token zu erstellen:
WSSFactory newSecurityToken(SAMLToken.class, callbackHandler, "system.wss.generate.saml")
Das Anfordern eines
SAML-Tokens erfordert die Java-Sicherheitsberechtigung
wssapi.SAMLTokenFactory.newSAMLToken. Verwenden Sie das Richtlinientool, um zu der Datei mit der
Java-Sicherheitsrichtlinie oder der Datei
was.policy des Anwendungsclients die folgende Richtlinienanweisung hinzuzufügen:
permission java.security.SecurityPermission "wssapi.SAMLTokenFactory.newSAMLToken"
Der Parameter SAMLToken.class gibt den Typ des zu erstellenden Sicherheitstokens
an.
Das Objekt
callbackHandler enthält Parameter, die die Merkmale des anzufordernden
SAML-Tokens definieren, und weitere Parameter, die erforderlich sind, um den STS zu erreichen und das SAML-Token anzufordern. Das Objekt SAMLGenerateCallbackHandler gibt
die in der folgenden Tabelle beschriebenen Konfigurationsparameter an.
Tabelle 1. Eigenschaften von SAMLGenerateCallbackHandler. In der folgenden Tabelle sind die Konfigurationsparameter für das Objekt SAMLGenerateCallbackHandler
bei Verwendung der Bestätigungsmethode Sender-Vouches beschrieben. Eigenschaft |
Beschreibung |
Erforderlich |
SamlConstants.CONFIRMATION_METHOD |
Gibt an, dass die Bestätigungsmethode sender-vouches verwendet werden soll |
Ja |
SamlConstants.TOKEN_TYPE |
Gibt den Tokentyp an Wenn einem Web-Service-Client Richtliniensätze zugeordnet sind, wird diese Eigenschaft nicht von der Web-Services-Security-Laufzeit verwendet.
Geben Sie
den Tokenwerttyp mit dem Attribut valueType der tokenGenerator-Bindungskonfiguration an.
Das Beispiel in dieser Prozedur nutzt ein SAML-1.1-Token.
Sie können aber auch den Wert WSSConstants.SAML.SAML20_VALUE_TYPE verwenden.
|
Ja |
SamlConstants.STS_ADDRESS |
Gibt die Adresse des Sicherheitstokenservice
an In der Task in diesem Artikel ist der Wert dieser Eigenschaft beispielsweise
auf https gesetzt, um anzugeben, dass die SAML-Tokenanforderung mit SSL geschützt
werden soll.
Sie müssen die Eigenschaft
-Dcom.ibm.SSL.ConfigURL setzen, damit SSL verwendet werden kann, um die
SAML-Tokenanforderung beim STS zu schützen.
|
Ja |
SamlConstants.SAML_APPLIES_TO |
Gibt die Adresse des Ziel-STS an, an der Sie das SAML-Token
verwenden möchten |
Nein |
SamlConstants.TRUST_CLIENT_COLLECTION_REQUEST |
Gibt an, ob beim STS ein einzelnes, in einem Element
RequestSecurityToken
(RST) eingeschlossenes Token angefordert werden soll oder eine Gruppe von RST-Elementen, die in nur einem
Element RequestSecurityTokenCollection (RSTC) eingeschlossen sind. Standardmäßig wird ein Einzeltoken angefordert, das in
einem Element
RequestSecurityToken (RST) vom STS eingeschlossen ist.
Wenn Sie für diese Eigenschaft den
Wert true angeben, werden mehrere Token in einer Gruppe von
RST-Elementen angefordert, die in einem einzelnen
Element RequestSecurityTokenCollection (RSTC) vom STS eingeschlossen ist.
|
Nein |
SamlConstants.TRUST_CLIENT_WSTRUST_NAMESPACE |
Gibt den in der WS-Trust-Anforderung enthaltenen WS-Trust-Namespace
an Der Standardwert ist WSTrust
1.3.
|
Nein |
Außerdem werden im Objekt SAMLGenerateCallbackHandler eine WSSGenerationContext-Instanz und eine WSSConsumingContext-Instanz
definiert. Die
WSSGenerationContext-Instanz muss ein Objekt UNTGenerateCallbackHandler
mit Informationen zur Erstellung des Benutzernamenstokens enthalten, das Sie an den STS
senden wollen.
Der Parameter
system.wss.generate.saml gibt das für die Erstellung des SAML-Tokens zu verwendende
JAAS-Anmeldemodul (Java Authentication and Authorization Service)
an. Sie müssen eine
JVM-Eigenschaft angeben, um eine JAAS-Konfigurationsdatei mit der erforderlichen
JAAS-Anmeldekonfiguration zu definieren. Beispiel:
-Djava.security.auth.login.config=Profilstammverzeichnis/properties/wsjaas_client.conf
Alternativ können Sie eine
Java-Systemeigenschaft im Beispielclientcode setzen, um eine JAAS-Anmeldekonfigurationsdatei anzugeben,
z. B.
System.setProperty("java.security.auth.login.config", "Profilstammverzeichnis/properties/wsjaas_client.conf");
- Fordern Sie die Token-ID des erstellten SAML-Tokens an.
Verwenden Sie als einfachen Test für das von Ihnen erstellte SAML-Token
die folgende Anweisung:
System.out.println("SAMLToken id = " + samlToken.getId())
Ergebnisse
Sie haben ein SAML-Token mit der Subjektbestätigungsmethode Sender-Vouches von einem externen
STS angefordert.
Das angeforderte Token haben Sie
dann mit Web-Service-Anforderungsnachrichten mit Transportschutz über das
JAX-WS-Programmiermodell und WSS-APIs gesendet.
Beispiel
Das folgende Codebeispiel ist eine vollständige, sofort einsatzfähige
Web-Service-Clientanwendung, die veranschaulicht, wie ein
SAML-Token von einem externen STS angefordert und in Web-Service-Anforderungsnachrichten mit Transportschutz gesendet
wird. Dieser Beispielcode veranschaulicht die oben beschriebenen Prozedurschritte.
/**
* Der folgende Quellcode ist von der IBM Corporation erstellter Beispielcode, der
* mit der Einschränkung bereitgestellt wird, dass er nur zur Unterstützung für die Nutzung
* der Technologie verwendet werden darf. Der Code wird ohne Wartung (auf "as-is"-Basis) und
* ohne Gewährleistung zur Verfügung gestellt. IBM ist nicht haftbar für Schäden, die Ihnen aus
* der Nutzung des Beispielcodes entstehen, selbst wenn IBM auf die Möglichkeit solche
* Schäden hingewiesen wurde.
*/
package com.ibm.was.wssample.sei.cli;
import com.ibm.was.wssample.sei.echo.EchoService12PortProxy;
import com.ibm.was.wssample.sei.echo.EchoStringInput;
import com.ibm.websphere.wssecurity.wssapi.WSSFactory;
import com.ibm.websphere.wssecurity.wssapi.WSSGenerationContext;
import com.ibm.websphere.wssecurity.wssapi.WSSConsumingContext;
import com.ibm.websphere.wssecurity.wssapi.WSSTimestamp;
import com.ibm.websphere.wssecurity.callbackhandler.SAMLGenerateCallbackHandler;
import com.ibm.websphere.wssecurity.callbackhandler.UNTGenerateCallbackHandler;
import com.ibm.websphere.wssecurity.wssapi.token.UsernameToken;
import com.ibm.websphere.wssecurity.wssapi.token.SAMLToken;
import com.ibm.websphere.wssecurity.wssapi.token.SecurityToken;
import com.ibm.wsspi.wssecurity.core.token.config.WSSConstants;
import com.ibm.wsspi.wssecurity.saml.config.SamlConstants;
import java.util.Map;
import java.util.HashMap;
import javax.xml.ws.BindingProvider;
public class SampleSamlSVClient {
private String urlHost = "localhost";
private String urlPort = "9443";
private static final String CONTEXT_BASE = "/WSSampleSei/";
private static final String ECHO_CONTEXT12 = CONTEXT_BASE+"EchoService12";
private String message = "HELLO";
private String uriString = "https://" + urlHost + ":" + urlPort;
private String endpointURL = uriString + ECHO_CONTEXT12;
private String input = message;
/**
* main()
*
* Befehlszeilenargumente siehe printusage()
*
* @param args
*/
public static void main(String[] args) {
SampleSamlSVClient sample = new SampleSamlSVClient();
sample.CallService();
}
/**
* CallService-Parameter wurden gelesen. Jetzt können die Serviceproxyklassen aufgerufen werden.
*
*/
void CallService() {
String response = "ERROR!:";
try {
System.setProperty("com.ibm.SSL.ConfigURL", "Profilstammverzeichnis//properties/ssl.client.props");
System.setProperty("java.security.auth.login.config", "Profilstammverzeichnis/properties/wsjaas_client.conf ");
// SAML-Token von externem STS anfordern
WSSFactory factory = WSSFactory.getInstance();
String STS_URI = "https://externalstsserverurl:port/TrustServerWST13/services/RequestSecurityToken";
String ENDPOINT_URL = "http://localhost:9080/WSSampleSei/EchoService";
WSSGenerationContext gencont1 = factory.newWSSGenerationContext();
WSSConsumingContext concont1 = factory.newWSSConsumingContext();
HashMap<Object, Object> cbackMap1 = new HashMap<Object, Object>();
cbackMap1.put(SamlConstants.STS_ADDRESS, STS_URI);
cbackMap1.put(SamlConstants.SAML_APPLIES_TO, ENDPOINT_URL);
cbackMap1.put(SamlConstants.TRUST_CLIENT_WSTRUST_NAMESPACE, "http://docs.oasis-open.org/ws-sx/ws-trust/200512");
cbackMap1.put(SamlConstants.TRUST_CLIENT_COLLECTION_REQUEST, "false");
cbackMap1.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML11_VALUE_TYPE);
cbackMap1.put(SamlConstants.CONFIRMATION_METHOD, "sender-vouches");
SAMLGenerateCallbackHandler cbHandler1 = new SAMLGenerateCallbackHandler(cbackMap1);
// UNT zur Trust-Anforderung hinzufügen
UNTGenerateCallbackHandler utCallbackHandler = new UNTGenerateCallbackHandler("testuser", "testuserpwd");
SecurityToken ut = factory.newSecurityToken(UsernameToken.class, utCallbackHandler);
gencont1.add(ut);
cbHandler1.setWSSConsumingContextForTrustClient(concont1);
cbHandler1.setWSSGenerationContextForTrustClient(gencont1);
SecurityToken samlToken = factory.newSecurityToken(SAMLToken.class, cbHandler1, "system.wss.generate.saml");
System.out.println("SAMLToken id = " + samlToken.getId());
// Web-Service-Client initialisieren
EchoService12PortProxy echo = new EchoService12PortProxy();
echo._getDescriptor().setEndpoint(endpointURL);
// SOAPAction-Eigenschaften konfigurieren
BindingProvider bp = (BindingProvider) (echo._getDescriptor().getProxy());
Map<String, Object> requestContext = bp.getRequestContext();
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);
requestContext.put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.TRUE);
requestContext.put(BindingProvider.SOAPACTION_URI_PROPERTY, "echoOperation");
// WSSGenerationContext initialisieren
WSSGenerationContext gencont = factory.newWSSGenerationContext();
gencont.add(samlToken);
// Zeitmarke hinzufügen
WSSTimestamp timestamp = factory.newWSSTimestamp();
gencont.add(timestamp);
gencont.process(requestContext);
// Eingabeobjekt erstellen
EchoStringInput echoParm =
new com.ibm.was.wssample.sei.echo.ObjectFactory().createEchoStringInput();
echoParm.setEchoInput(input);
System.out.println(">> CLIENT: SEI Echo to " + endpointURL);
// Verarbeitung der Zeitmarke in der Antwortnachricht vorbereiten
WSSConsumingContext concont = factory.newWSSConsumingContext();
concont.add(WSSConsumingContext.TIMESTAMP);
concont.process(requestContext);
// Service aufrufen
response = echo.echoOperation(echoParm).getEchoResponse();
System.out.println(">> CLIENT: SEI Echo invocation complete.");
System.out.println(">> CLIENT: SEI Echo response is: " + response);
} catch (Exception e) {
System.out.println(">> CLIENT: ERROR: SEI Echo EXCEPTION.");
e.printStackTrace();
}
}
}
Wenn diese Beispiel-Web-Service-Clientanwendung ordnungsgemäß ausgeführt wird, empfangen Sie
Nachrichten wie die folgenden:
SAMLToken id = _6CDDF0DBF91C044D211271166233407
Retrieving document at 'file:Profilstammverzeichnis/.../wsdl/'.
>> CLIENT: SEI Echo to http://localhost:9443/WSSampleSei/EchoService12
>> CLIENT: SEI Echo invocation complete.
>> CLIENT: SEI Echo response is: SOAP12==>>HELLO