Let's start simple with one of the following policies
oracle/wss_http_token_service_policy
oracle/wss_username_token_service_policy
These policies can be used for HTTP Basic Authentication or for an Username Token in a SOAP message. The only thing you need to do for these policies is to add some Users to the myrealm Security Realm in the WebLogic Console.
On the client side you need to do the following.
execute = new Execute(); SecurityPolicyFeature[] securityFeatures = new SecurityPolicyFeature[] { new SecurityPolicyFeature("oracle/wss_username_token_client_policy") }; Request_Response_ptt request_Response_ptt = execute.getRequest_Response_pt(securityFeatures); // Add your code to call the desired methods. Map<String, Object> reqContext = ((BindingProvider) request_Response_ptt).getRequestContext(); reqContext.put(BindingProvider.USERNAME_PROPERTY, "test" ); reqContext.put(BindingProvider.PASSWORD_PROPERTY, "weblogic1" ); Request req = new Request(); req.setName("edwin"); req.setMessage("hi"); Response resp = request_Response_ptt.requestResponse(req);
The Message protection policies
oracle/wss10_message_protection_service_policy
oracle/wss11_message_protection_service_policy
When you choose for one of these policies you need to generate a Server certificate for encryption and put this in a Java keystore and for the Client side you also need to make a Keystore but this contains only the public key of this Server encryption certificate ( this is in case of the wss11, for the wss10 you also need to generate a client certificate besides the public key of server, see the x509_token_with_message_protection policies how to do this. ).
To add your Server keystore to FMW, you need to go to the Enterprise Manager and select your Weblogic Domain. In the menu go to the Security / Security Provider Configuration page. And on this page you can import your Java keystore. Before you start you need to copy your keystore to your domain folder and put this in the config/fmwconfig folder.
In this example I used two certificates one for the signature and one for the encryption. For the wss11 Message protection Service policies you only need the encryption certificate.
On the client side you need to load the client keystore and the public key of server encryption certificate.
execute = new Execute(); SecurityPolicyFeature[] securityFeatures = new SecurityPolicyFeature[] { new SecurityPolicyFeature("oracle/wss11_message_protection_client_policy") }; Request_Response_ptt request_Response_ptt = execute.getRequest_Response_pt(securityFeatures); // Add your code to call the desired methods. Map<String, Object> reqContext = ((BindingProvider) request_Response_ptt).getRequestContext(); reqContext.put(ClientConstants.WSSEC_KEYSTORE_TYPE, "JKS"); reqContext.put(ClientConstants.WSSEC_KEYSTORE_LOCATION, "C:/client_keystore.jks"); reqContext.put(ClientConstants.WSSEC_KEYSTORE_PASSWORD, "welcome"); reqContext.put(ClientConstants.WSSEC_ENC_KEY_ALIAS, "server_encr"); reqContext.put(ClientConstants.WSSEC_ENC_KEY_PASSWORD, "welcome"); reqContext.put(ClientConstants.WSSEC_RECIPIENT_KEY_ALIAS, "server_encr"); Request req = new Request(); req.setName("edwin"); req.setMessage("hi"); Response resp = request_Response_ptt.requestResponse(req);For the wss10_message_protection_service_policy you need to do the following.
execute = new Execute(); SecurityPolicyFeature[] securityFeatures = new SecurityPolicyFeature[] { new SecurityPolicyFeature("oracle/wss10_message_protection_client_policy") }; Request_Response_ptt request_Response_ptt = execute.getRequest_Response_pt(securityFeatures); // Add your code to call the desired methods. Map<String, Object> reqContext = ((BindingProvider) request_Response_ptt).getRequestContext(); reqContext.put(ClientConstants.WSSEC_KEYSTORE_TYPE, "JKS"); reqContext.put(ClientConstants.WSSEC_KEYSTORE_LOCATION, "C:/client_keystore.jks"); reqContext.put(ClientConstants.WSSEC_KEYSTORE_PASSWORD, "welcome"); reqContext.put(ClientConstants.WSSEC_ENC_KEY_ALIAS, "client1"); reqContext.put(ClientConstants.WSSEC_ENC_KEY_PASSWORD, "welcome"); reqContext.put(ClientConstants.WSSEC_RECIPIENT_KEY_ALIAS, "server_encr"); reqContext.put(ClientConstants.WSSEC_SIG_KEY_ALIAS, "client1"); reqContext.put(ClientConstants.WSSEC_SIG_KEY_PASSWORD, "welcome"); Request req = new Request(); req.setName("edwin"); req.setMessage("hi"); Response resp = request_Response_ptt.requestResponse(req);
The above policies can also be combined. Like in these policies.
oracle/wss10_username_token_with_message_protection_service_policy
oracle/wss11_username_token_with_message_protection_service_policy
For these policies you need to a create user in the WebLogic Console for the username token and generate a server and client keystore for the message protection part.
On the client side you need to the following.
execute = new Execute(); SecurityPolicyFeature[] securityFeatures = new SecurityPolicyFeature[] { new SecurityPolicyFeature("oracle/wss11_username_token_with_message_protection_client_policy") }; Request_Response_ptt request_Response_ptt = execute.getRequest_Response_pt(securityFeatures); // Add your code to call the desired methods. Map<String, Object> reqContext = ((BindingProvider) request_Response_ptt).getRequestContext(); reqContext.put(BindingProvider.USERNAME_PROPERTY, "test" ); reqContext.put(BindingProvider.PASSWORD_PROPERTY, "weblogic1" ); reqContext.put(ClientConstants.WSSEC_KEYSTORE_TYPE, "JKS"); reqContext.put(ClientConstants.WSSEC_KEYSTORE_LOCATION, "C:/client_keystore.jks"); reqContext.put(ClientConstants.WSSEC_KEYSTORE_PASSWORD, "welcome"); reqContext.put(ClientConstants.WSSEC_ENC_KEY_ALIAS, "server_encr"); reqContext.put(ClientConstants.WSSEC_ENC_KEY_PASSWORD, "welcome"); reqContext.put(ClientConstants.WSSEC_RECIPIENT_KEY_ALIAS, "server_encr"); Request req = new Request(); req.setName("edwin"); req.setMessage("hi"); Response resp = request_Response_ptt.requestResponse(req);For the wss10_username_token_with_message_protection_service_policy you need to do the following. ( and a need a client certificate and the public key of the server )
execute = new Execute(); SecurityPolicyFeature[] securityFeatures = new SecurityPolicyFeature[] { new SecurityPolicyFeature("oracle/wss10_username_token_with_message_protection_client_policy") }; Request_Response_ptt request_Response_ptt = execute.getRequest_Response_pt(securityFeatures); // Add your code to call the desired methods. Map<String, Object> reqContext = ((BindingProvider) request_Response_ptt).getRequestContext(); reqContext.put(BindingProvider.USERNAME_PROPERTY, "test" ); reqContext.put(BindingProvider.PASSWORD_PROPERTY, "weblogic1" ); reqContext.put(ClientConstants.WSSEC_KEYSTORE_TYPE, "JKS"); reqContext.put(ClientConstants.WSSEC_KEYSTORE_LOCATION, "C:/client_keystore.jks"); reqContext.put(ClientConstants.WSSEC_KEYSTORE_PASSWORD, "welcome"); reqContext.put(ClientConstants.WSSEC_ENC_KEY_ALIAS, "client1"); reqContext.put(ClientConstants.WSSEC_ENC_KEY_PASSWORD, "welcome"); reqContext.put(ClientConstants.WSSEC_RECIPIENT_KEY_ALIAS, "server_encr"); reqContext.put(ClientConstants.WSSEC_SIG_KEY_ALIAS, "client1"); reqContext.put(ClientConstants.WSSEC_SIG_KEY_PASSWORD, "welcome"); Request req = new Request(); req.setName("edwin"); req.setMessage("hi"); Response resp = request_Response_ptt.requestResponse(req);
The last part of this blogpost I will explain the following policies
oracle/wss10_x509_token_with_message_protection_service_policy
oracle/wss11_x509_token_with_message_protection_service_policy
These policies will use the client certificate for the signature and the public key of the server encryption certificate for the encryption.
So we start by making some keystores with some certificates. I don't use self signed certificates because then for every new client I need to update the server keystore and reboot the FMW server. Now I only have to import the CA public certificate in the Server keystore. This is how my Server keystore looks like
It got a private certificate for the server signature and for encryption. The CA public key is trusted.
For the client I have this keystore. ( Every customer / application can have its own client keystore )
The CA and Server encryption certificates are public certificates and are trusted.
Because the FMW Server does not know this client certificate ( it only knows the CA ) you need to add a new user in the myrealm Secuirty Realm in the WebLogic Console. The password of this user is not important, the only requirement is that the common name of this client certificate is the same as the WebLogic Username.
And as last the Client code, where we need to provide the client signature certificate details.
execute = new Execute(); SecurityPolicyFeature[] securityFeatures = new SecurityPolicyFeature[] { new SecurityPolicyFeature("oracle/wss11_x509_token_with_message_protection_client_policy") }; Request_Response_ptt request_Response_ptt = execute.getRequest_Response_pt(securityFeatures); // Add your code to call the desired methods. Map<String, Object> reqContext = ((BindingProvider) request_Response_ptt).getRequestContext(); reqContext.put(ClientConstants.WSSEC_KEYSTORE_TYPE, "JKS"); reqContext.put(ClientConstants.WSSEC_KEYSTORE_LOCATION, "C:/client_keystore.jks"); reqContext.put(ClientConstants.WSSEC_KEYSTORE_PASSWORD, "welcome"); reqContext.put(ClientConstants.WSSEC_SIG_KEY_ALIAS, "client1"); reqContext.put(ClientConstants.WSSEC_SIG_KEY_PASSWORD, "welcome"); reqContext.put(ClientConstants.WSSEC_ENC_KEY_ALIAS, "server_encr"); reqContext.put(ClientConstants.WSSEC_ENC_KEY_PASSWORD, "welcome"); reqContext.put(ClientConstants.WSSEC_RECIPIENT_KEY_ALIAS, "server_encr"); Request req = new Request(); req.setName("edwin"); req.setMessage("hi"); Response resp = request_Response_ptt.requestResponse(req);
For OWSM SAML policies see this blogpost
For OWSM kerberos policies see this blogpost