启用 SSL 通信以访问 Web Service
可以配置 SSL 通信以便客户机应用程序访问 Web Service。
开始之前
- 为客户机和提供者生成一对自签名的公用密钥和专用密钥:
keytool -genkey -alias default -keystore myKey.jks -dname "CN=myServer, O=IBM, C=CN" -storepass passw0rd -keypass passw0rd -storetype jks -validity 1000 -keyalg RSA
- 将 myKey.jks 文件复制到 Liberty 概要文件服务器的 ${server.config.dir}/resources/security 目录
注: 可以在 Java™ 安装目录中找到 keytool 实用程序。
关于此任务
如果您需要将 Web Service 客户机应用程序与安全 HTTP 协议一起使用来访问受保护的 Web Service 资源,那么将按照 SSL 规范对所有消息进行加密。
过程
- 在 server.xml 文件中启用
jaxws-2.2、servlet-3.0(或 servlet-3.1)和 appSecurity-2.0 功能部件。
<featureManager> <feature>jaxws-2.2</feature> <feature>servlet-3.0</feature> <feature>appSecurity-2.0</feature> </featureManager>
- 在 server.xml 文件中配置 SSL 元素。
<sslDefault sslRef="customizeSSLConfig" /> <ssl id="customizeSSLConfig" keyStoreRef="serverKeyStore" trustStoreRef="serverTrustStore" /> <keyStore id="serverKeyStore" location="myKey.jks" type="JKS" password="passw0rd" /> <keyStore id="serverTrustStore" location="myKey.jks" type="JKS" password="passw0rd" />
- 通过指定 Web Service 端点来配置服务提供者。
- 创建 Web Service。
@WebService(serviceName = "SayHelloPojoService", portName = "SayHelloPojoPort") public class SayHelloPojoService implements SayHelloService { ... } @WebService(serviceName = "SayHelloStatelessService", portName = "SayHelloStatelessPort", endpointInterface = "com.ibm.ws.jaxws.transport.server.security.SayHelloService") @Stateless(name = "SayHelloSessionBean") public class SayHelloStatelessService implements SayHelloLocal { ... }
- 为服务提供者配置 ibm-ws-bnd.xml 文件。
<?xml version="1.0" encoding="UTF-8"?> <webservices-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-ws-bnd_1_0.xsd " version="1.0"> <http-publishing> <webservice-security> <security-constraint> <web-resource-collection> <web-resource-name>All</web-resource-name> <url-pattern>/*</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint> </webservice-security> </http-publishing> </webservices-bnd>
注: ibm-ws-bnd.xml 文件必须位于 Web 应用程序的 /WEB-INF 目录中,或者位于基于 EJB 的 Web Service 应用程序(JAR 归档)的 /META-INF 目录中。
- 创建 Web Service。
- 通过指定 Web Service 端点来配置服务客户机。例如,客户机应用程序是一个名为 TransportSecurityClient.war 的 Web 应用程序。
- 在 server.xml 文件中配置客户机应用程序。
<application id="TransportSecurityClient" name="TransportSecurityClient" location="TransportSecurityClient.war" context-root="TransportSecurityClient" type="war" />
- 配置客户机应用程序的 ibm-ws-bnd.xml 文件。
<?xml version="1.0" encoding="UTF-8"?> <webservices-bnd id="idvalue0" version="1.0" xmlns="http://websphere.ibm.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-ws-bnd_1_0.xsd " > <!-- POJO service reference binding--> <service-ref name="service/SayHelloPojoService"> <port name="SayHelloPojoPort" namespace="http://ibm.com/ws/jaxws/transport/security/" ssl-ref="customizeSSLConfig"/> <properties http.conduit.tlsClientParameters.disableCNCheck="true" /> </service-ref> <!-- Stateless service reference binding--> <service-ref name="service/SayHelloStatelessService"> <port name="SayHelloStatelessPort" namespace="http://ibm.com/ws/jaxws/transport/security/" ssl-ref="customizeSSLConfig"/> <properties http.conduit.tlsClientParameters.disableCNCheck="true" /> </service-ref> </webservices-bnd>
注:- ibm-ws-bnd.xml 文件必须位于客户机 Web 应用程序的 /WEB-INF 目录中。
- ssl-ref 属性的值必须与 server.xml 文件中的 ssl 元素的标识值相匹配。
- 如果在 ibm-ws-bnd.xml 文件中未指定 ssl-ref 属性,那么 Web Service 引擎将使用 Liberty 概要文件中的缺省 SSL 配置(如果此配置存在)。
- http.conduit.tlsClientParameters.disableCNcheck 属性用来控制是否验证远程服务器。在生产环境中对此属性使用 false,因为如果此属性是 true,那么将忽略 hostName 验证。
- 通过 WSDL 位置来生成客户机存根。
@WebServiceClient(name = "SayHelloPojoService", targetNamespace = "http://ibm.com/ws/jaxws/transport/security/", wsdlLocation = "https://localhost:8020/TransportSecurityProvider/unauthorized/employPojoService?wsdl") public class SayHelloPojoService extends Service {...} @WebServiceClient(name = "SayHelloStatelessService", targetNamespace = "http://ibm.com/ws/jaxws/transport/security/", wsdlLocation = "https://localhost:8020/TransportSecurityProvider/unauthorized/EmployStatelessService?wsdl") public class SayHelloStatelessService extends Service {...}
- 使用 @WebServiceRef 注释将 Web Service 插入到 Servlet。例如,TestJaxWsTransportSecurityServlet。
@WebServiceRef(name = "service/SayHelloPojoService") SayHelloPojoService pojoService; @WebServiceRef(name = "service/SayHelloStatelessService") SayHelloStatelessService statelessService;
- 在 server.xml 文件中配置客户机应用程序。
相关参考:

信息中心的条款和条件 | 反馈

http://www14.software.ibm.com/webapp/wsbroker/redirect?version=phil&product=was-libcore-mp&topic=twlp_sec_ws_ssl
文件名:twlp_sec_ws_ssl.html