Saml:GetSamlToken
From Adapt
Client connection to Authority
Prepare keystore
You'll need to have a keystore that contains the following items:
- Client keypair with public key signed by a CA that is known to the Authority
- Copy of the Authorities public key to validate the returned assertion.
Here's a sample on how to load the keystore and required certs.
import static edu.umiacs.wssec.Wss4jConstants.KEYSTORE_TYPE_DEFAULT; import static edu.umiacs.wssec.Wss4jConstants.KEYSTORE_PROVIDER_DEFAULT; ... ... public static final String KEYSTORE_PATH = "client.p12"; public static final String KEYSTORE_ALIAS = "client"; public static final String KEYSTORE_PASS = "client"; public static final String KEYSTORE_AUTHORITY = "authority"; Certificate clientCert; Certificate authorityCert; KeyStore keyStore; keyStore = KeyStore.getInstance(KEYSTORE_TYPE_DEFAULT,KEYSTORE_PROVIDER_DEFAULT); keyStore.load(new FileInputStream( new File(KEYSTORE_PATH) ), KEYSTORE_PASS.toCharArray()); // check for alias of private key if (!keyStore.containsAlias(KEYSTORE_ALIAS) || !(keyStore.getKey(KEYSTORE_ALIAS, KEYSTORE_PASS.toCharArray()) != null )) { System.err.println("cannot load keystore alias"); } clientCert = keyStore.getCertificateChain(KEYSTORE_ALIAS)[0]; authorityCert = keyStore.getCertificate(KEYSTORE_AUTHORITY); //For later, cache keystore CachedDoAllSender.setSignatureKeyStore(keyStore);
Call Authority
Next, call the authority, get the certificate and convert it to a SAMLAssertion
// standard axis wsdl2java generated stubs. You can add extra handlers, wss4j, etc if you // authority uses it for authentication. Authority auth; AuthorityServiceLocator authSL; authSL = new AuthorityServiceLocator(); authSL.setAuthorityEndpointAddress(SERVICE_AUTH_URL); auth = authSL.getAuthority(); String samlToken = auth.authenticateClient(clientCert.getEncoded()); // convert assertion SAMLAssertion assertion = new SAMLAssertion( new ByteArrayInputStream(samlToken.getBytes()));
Validate Assertion
You need to validate that the assertion was issued by the authority you expected and not merely by another party w/ a key signed by the same CA as the authorities key. The easiet way to do this is to keep a copy of the authorities key locally.
// throws exception if it can't verify assertion.verify(authorityCert); // For later, cache assertion. CachedDoAllSender.setSamlAssertion(assertion);