您可以请求外部安全性令牌服务 (STS) 以使用 Java™ API
for XML-Based Web Services (JAX-WS) 编程模型和 Web Service 安全 API (WSS API) 发布具有 holder-of-key 主体集确认方法的 SAML 令牌以及 X.509 证书中的公用密钥。
开始之前
本任务假设您熟悉 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 利用 WSS API 请求具有 holder-of-key 主体集确认方法的 SAML 令牌和 X.509 证书中的嵌入式公用密钥的示例代码。
此任务关注请求 SAML holder-of-key 令牌时将 X.509 证书发送到外部 STS。
过程
- 指定从其请求 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");
cbackMap1.put(SamlConstants.SAML_APPLIES_TO, "http://myhost:9080/myService");
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");
对于 holder-of-key 主体集确认方法,您必须指定在 SAML 令牌中嵌入公用密钥还是对称密钥。该示例指定公用密钥类型。然后,它指定包含公用密钥的证书位置以及发送者的相应专用密钥的位置以对 SOAP 消息的元素进行数字签名来满足 holder-of-key 主体集确认需求。
- 指定要嵌入在 SAML 令牌中的 X.509 证书的位置和相应的专用密钥以用于对消息元素进行数字签名;例如:
cbackMap1.put(SamlConstants.KEY_TYPE,
"http://docs.oasis-open.org/ws-sx/ws-trust/200512/PublicKey");
cbackMap1.put(SamlConstants.KEY_ALIAS, "soapinitiator" );
cbackMap1.put(SamlConstants.KEY_NAME, "CN=SOAPInitator, O=Example");
cbackMap1.put(SamlConstants.KEY_PASSWORD, "myinitatkeypass");
cbackMap1.put(SamlConstants.KEY_STORE_PATH, "keystores/initiator.jceks");
cbackMap1.put(SamlConstants.KEY_STORE_PASSWORD, "myinitatstorepass");
cbackMap1.put(SamlConstants.KEY_STORE_TYPE, "jceks");
SAMLGenerateCallbackHandler cbHandler1 = new SAMLGenerateCallbackHandler(cbackMap1);
cbHandler1.setWSSConsumingContextForTrustClient(concont1);
cbHandler1.setWSSGenerationContextForTrustClient(gencont1);
SecurityToken samlToken = factory.newSecurityToken(SAMLToken.class,
cbHandler1, "system.wss.generate.saml");
指定的 X.509 证书随 WS 信任请求发送到外部 STS 中的 trust:UseKey元素。有关更多信息,请阅读关于 SAML 令牌概要文件标准中定义的 SAML 声明的信息。
在此示例中,SSL 用于保护 WS 信任请求和响应消息的完整性和机密性。
结果
您已了解用于使用 WSS API 从外部 STS 请求具有 holder-of-key 主体集确认方法和非对称密钥的 SAML 令牌的关键构建块。要使用 SAML 令牌来签署请求消息,请熟悉“使用 WSS API 传播具有非对称密钥的自签发 SAML holder-of-key 令牌”主题中的示例代码。