001 package WSSE.clientCert;
002
003 import java.util.List;
004 import java.util.ArrayList;
005 import java.security.KeyStore;
006 import java.security.PrivateKey;
007 import java.security.cert.X509Certificate;
008 import java.security.cert.CertificateException;
009 import javax.xml.rpc.ServiceException;
010 import javax.xml.namespace.QName;
011 import javax.xml.rpc.handler.HandlerInfo;
012 import javax.xml.rpc.handler.HandlerRegistry;
013 import weblogic.Home;
014 import weblogic.webservice.context.WebServiceSession;
015 import weblogic.webservice.context.WebServiceContext;
016 import weblogic.webservice.core.handler.WSSEClientHandler;
017 import weblogic.webservice.WLMessageContext;
018 import weblogic.xml.security.wsse.Security;
019 import weblogic.xml.security.wsse.Token;
020 import weblogic.xml.security.wsse.BinarySecurityToken;
021 import weblogic.xml.security.wsse.SecurityElementFactory;
022 import weblogic.xml.security.specs.SignatureSpec;
023 import weblogic.jws.proxies.MyCompany;
024 import weblogic.jws.proxies.MyCompany_Impl;
025 import weblogic.jws.proxies.MyCompanySoap;
026 import weblogic.xml.security.UserInfo;
027 import weblogic.xml.security.specs.EncryptionSpec;
028
029 /*
030 * This client (1) adds a digital certificate to the invoking SOAP message,
031 * (2) encrypts the invoking SOAP message,
032 * and (3) adds a username/password token to the SOAP message.
033 */
034 public class MyCompanyClient {
035
036 public static final String USERNAME="weblogic";
037 public static final String USER_PASSWORD="weblogic";
038
039 /*
040 * Home.getPath() returns the String value WL_HOME + "/server".
041 * Home.getPath().replaceAll("/server", "") extracts the value of WL_HOME.
042 */
043 private static final String CLIENT_KEYSTORE = Home.getPath().replaceAll("/server", "") + "/samples/domains/workshop/samples_client.jks";
044 private static final String KEYSTORE_PASS = "password";
045 private static final String KEY_ALIAS = "client1";
046 private static final String SERVER_KEY_ALIAS = "mycompany";
047 private static final String KEY_PASSWORD = "password";
048
049 public static void main(String[] args) {
050
051 try{
052 /*
053 * Instantiate the main proxy class. The proxy class has the same name as the
054 * web service, with "_Impl" appended.
055 */
056 MyCompany myservice = new MyCompany_Impl("http://localhost:7001/WebServices/security/wsse/reqResp/mycompany/MyCompany.jws?WSDL");
057
058 WebServiceContext context = myservice.context();
059 WebServiceSession session = context.getSession();
060
061 /**
062 * Registers a handler for the SOAP message traffic.
063 HandlerRegistry registry = myservice.getHandlerRegistry();
064 List list = new ArrayList();
065 list.add(new HandlerInfo(WSSEClientHandler.class, null, null));
066 registry.setHandlerChain(new QName("hello"), list);
067 */
068 final KeyStore keystore = KeyUtil.loadKeystore(CLIENT_KEYSTORE, KEYSTORE_PASS);
069
070 // Add a client certificate
071
072 X509Certificate clientcert = KeyUtil.getCertificate(KEY_ALIAS, keystore);
073
074 PrivateKey clientprivate = KeyUtil.getPrivateKey(KEY_ALIAS, KEY_PASSWORD, keystore);
075
076 SecurityElementFactory factory = SecurityElementFactory.getDefaultFactory();
077
078 Token x509token = factory.createToken(clientcert, clientprivate);
079
080 SignatureSpec sigSpec = SignatureSpec.getDefaultSpec();
081
082 Security security = factory.createSecurity(null);
083
084 security.addSignature(x509token, sigSpec);
085
086 security.addToken(x509token);
087
088 // Encrypts the SOAP body
089
090 X509Certificate servercert = KeyUtil.getCertificate(SERVER_KEY_ALIAS, keystore);
091
092 EncryptionSpec encSpec = EncryptionSpec.getDefaultSpec();
093
094 Token serverToken = factory.createToken(servercert, null);
095
096 security.addEncryption(serverToken, encSpec);
097
098 // Adds a username/password token
099
100 /**
101 * Set the username and password token for SOAP message sent from the client, through
102 * the proxy, to the web service.
103 */
104 UserInfo ui = new UserInfo("weblogic", "weblogic");
105 session.setAttribute(WSSEClientHandler.REQUEST_USERINFO, ui);
106
107 /**
108 * Adds the username / password token to the SOAP header.
109 */
110 Security security2 = factory.createSecurity(null);
111 security.addToken(ui);
112 session.setAttribute(WSSEClientHandler.REQUEST_SECURITY, security);
113
114 /*
115 * Get the protocol-specific proxy class.
116 */
117 MyCompanySoap msg = myservice.getMyCompanySoap();
118
119 /*
120 * Add the security element to the request.
121 */
122 context.getSession().setAttribute(WSSEClientHandler.REQUEST_SECURITY, security);
123
124 /*
125 * Set the client's private key to decrypt the response
126 */
127 session.setAttribute(WSSEClientHandler.KEY_ATTRIBUTE, clientprivate);
128
129 /**
130 * Invoke the web service method hello()
131 */
132 String result = msg.hello();
133
134 System.out.println();
135 System.out.println("Web Service Response:");
136 System.out.println(result);
137 }
138 catch(Exception e){
139 e.printStackTrace();
140 }
141 }
142 }
|