您可以请求外部安全性令牌服务 (STS) 以为目标服务加密的对称密钥发布具有 holder-of-key 主体集确认方法的 SAML 令牌。使用 Java™ API for XML-Based Web Services (JAX-WS) 编程模型和 Web service 安全 API (WSS API) 来完成此任务。
开始之前
本任务假设您熟悉 JAX-WS 编程模型、WSS API 接口、SAML 概念以及策略集的使用以配置和管理 Web service 设置。
请在开始本任务前,完成下列操作:
- 阅读关于使用 WSS API 以对称密钥传播自签发 SAML holder-of-key 令牌的信息。
- 熟悉如何将 SAML 令牌中的嵌入式密钥材料用于使用 WSS API 进行的消息保护。您的使用方案要求从外部 STS 请求 SAML 令牌,而不是使用自签发 SAML 令牌。
- 阅读关于从外部 STS 请求 SAML 发送者保证令牌以使用 WSS API 与消息级别保护来进行传播的信息。
- 阅读关于从外部 STS 请求 SAML 发送者保证令牌以使用 WSS API 与传输级别保护来进行传播的信息。
- 阅读关于从外部 STS 请求 SAML 不记名令牌以使用 WSS API 与传输级别保护来进行传播的信息。
- 熟悉使用 WSS API 来访问外部 STS。
关于此任务
此任务显示用于从外部 STS 请求 SAML 令牌的示例代码,此令牌具有 holder-of-key 主体集确认方法以及使用 WSS API 为目标服务加密的嵌入式对称密钥。此任务关注将 WS 信任请求消息发送到外部 STS 以请求具有对称密钥的 SAML holder-of-key 令牌。
过程
- 指定从其请求 SAML 安全性令牌的 STS,该令牌中包含 holder-of-key 主体集确认方法;例如:
com.ibm.websphere.wssecurity.wssapi.WSSFactory factory =
com.ibm.websphere.wssecurity.wssapi.WSSFactory.getInstance();
WSSGenerationContext gencont1 = factory.newWSSGenerationContext();
WSSConsumingContext concont1 = factory.newWSSConsumingContext();
HashMap<Object, Object> cbackMap1 = new HashMap<Object, Object>();
cbackMap1.put(SamlConstants.STS_ADDRESS, "https://www.example.com/sts"); //STS URL
cbackMap1.put(SamlConstants.SAML_APPLIES_TO, "http://myhost:9080/myService"); //Target Service
cbackMap1.put(IssuedTokenConfigConstants.TRUST_CLIENT_SOAP_VERSION, "1.1");
cbackMap1.put(IssuedTokenConfigConstants.TRUST_CLIENT_WSTRUST_NAMESPACE,
"http://docs.oasis-open.org/ws-sx/ws-trust/200512");
cbackMap1.put(IssuedTokenConfigConstants.TRUST_CLIENT_COLLECTION_REQUEST,
"true"); //RST or RSTC
cbackMap1.put(SamlConstants.TOKEN_TYPE,
"http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0");
cbackMap1.put(SamlConstants.CONFIRMATION_METHOD, "holder-of-key");
要从 STS 请求 holder-of-key SAML 安全性令牌,您必须通过信任请求中的 KeyType 元素来指定嵌入对称密钥还是公用密钥。此示例需要对称密钥类型,如下一步中所示。
- 指定要嵌入在 SAML 安全性令牌中的对称密钥;例如:
cbackMap1.put(SamlConstants.KEY_TYPE,
"http://docs.oasis-open.org/ws-sx/ws-trust/200512/SymmetricKey");
SAMLGenerateCallbackHandler cbHandler1 = new SAMLGenerateCallbackHandler(cbackMap1);
cbHandler1.setWSSConsumingContextForTrustClient(concont1);
cbHandler1.setWSSGenerationContextForTrustClient(gencont1);
SecurityToken samlToken = factory.newSecurityToken(SAMLToken.class,
cbHandler1, "system.wss.generate.saml");
请求的 SAML 令牌包含为目标服务加密的对称密钥。此 STS 还通过
WS-Trust RequestedProofToken 元素返回未加密的对称密钥。
请参阅以下示例。
<wst:RequestedProofToken>
<wst:BinarySecret
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
wsu:Id="_27325D34CE4BCC83141288966548620">n68rFQba+XTZLNBfEc4prg==</wst:BinarySecret>
</wst:RequestedProofToken>
在此显示 RequestedProofToken 元素以供您参考。没有向 WSS API 用户展示详细的处理。RequestedProofToken 元素和对称密钥是由 Web Service 安全运行时环境处理,或者更准确地由 system.wss.geenrate.saml JAAS 登录配置中指定的 SAMLGenerateLoginModule 处理。
结果
您已了解用于使用 WSS API 从外部 STS 请求具有 holder-of-key 主体集确认方法和对称密钥的 SAML 令牌的关键构建块。要使用 SAML 令牌来签署请求消息,请复审“使用 WSS API 传播具有对称密钥的自签发 SAML holder-of-key 令牌”主题中的示例代码。