在JAX-RPC Web服务中创建安全性
本节讲述为JAX-RPC服务应用程序提供安全性的过程,主要是通过应用HTTP/SSL到基本和交互认证,从而为容纳应用的web容器提供安全性来实现。关于认证的更多信息,请参见Sun ONE应用服务器开发人员web应用指南。
本节阐述了以下主题:
为了给HTTP/S 基本和交互认证配置JAX-RPC web服务终端,必须执行以下步骤:
使用作为J2SE SDK 一部分的keytool生成证书和击键密码。
向sun-web.xml配置描述文件中添加安全元素
在客户端代码中添加一些属性
编译并且运行web服务
基于SSL的基本认证
以下是为基于HTTP/S的基本认证配置Web service的步骤:
1.配置一个证书并且在服务器的HTTP监听上启动SSL。关于配置证书和在HTTP上启动SSL的更多信息,请分别参见Sun ONE应用服务器管理员安全手册中的“管理证书”和“启动安全”两节。
HTTP客户端在SSL握手验证服务器证书的时候,使用一系列的可信证书授权(CA)。证明服务器CA是客户端的可信CA,是非常重要的。
2.对于基于J2SE 1.4的客户端,其中包括基于JSSE的客户端,例如web服务应用程序,你需要导入服务器CA的证书到JSSE cacerts 数据库。请使用命令行工具keytool来导入可信的CA证书。
以下代码示范了如何导入CA的证书到基于J2SE的客户端的可信CA数据库。
keytool -import -v -alias "CMS-CA" -file cmsca.cer -keystore cacerts
关于如何使用keytool,可以用-help选项运行keytool,或者参阅以下网址:
http://java.sun.com/products/jdk/1.2/docs/tooldocs/solaris/keytool.html
3. 输入密码库密码:changeit
Owner: CN=Certificate Manager, OU=AppServices, O=Sun Microsystems, L=SCA, ST=California, C=US
Issuer: CN=Certificate Manager, OU=AppServices, O=Sun Microsystems, L=SCA, ST=California, C=US
Serial number: 1
Valid from: Mon Jun 03 12:00:00 PDT 2002 until: Thu Jun 03 12:00:00 PDT 2004
Certificate fingerprints:
MD5: 6C:8D:A6:E4:55:52:1A:FF:9D:19:44:D7:0F:62:66:95
SHA1:89:B1:0E:7E:8F:56:B2:34:65:46:15:86:53:7E:3E:6B:4F:9D:84:63
Trust this certificate? [no]: yes
Certificate was added to keystore
[Saving cacerts]
4. 配置服务器实例使用合适的域,并且确认该域中包括了你允许访问web服务的用户。
例如,为了配置一个扁平文件用户,请在管理界面中执行以下步骤:
选择server instance并且点击左边面板中的Security节点。
在右边面板中为Default Realm选择下拉框,并且选中"file"选项。
在左侧面板中选择Realms,通过点击file realm把用户加入到文件域中。
使修改生效。现在,服务器的扁平文件用户数据库就可以被使用了。
关于配置服务器实例从而使用域的详细信息,请参考Sun ONE 应用服务器管理员指南。
向web.xml添加安全元素
为web应用激活基本认证并指定一个约束进行强制认证。关于web.xml中安全元素的更多信息,请参见Sun ONE 应用服务器开发人员web应用指南。
这里有一个为web服务的基于servlet的终端配置基本认证的例子。这个安全约束使主要用户名称具备了"ServiceUser"角色,该角色在sun-web.xml文件中被映射为用户”bob”。
The WEB-INF/web.xml:
<security-constraint>
....
<web-resource-collection>
<web-resource-name>SecureHello</web-resource-name>
<url-pattern>/security</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
The WEB-INF/sun-web.xml:
<sun-web-app>
<security-role-mapping>
<role-name>ServiceRole</role-name> <principal-name>bob</principal-name>
</security-role-mapping>
</sun-web-app>
5. 为基于J2SE的客户端设置安全属性。想得到逐步指导,请参见"在客户端代码中设置安全属性"。
在客户端代码中设置安全属性
为了实现基于SSL的基本认证,客户端代码必须设定一些安全相关的属性。
TrustStore属性
客户端象下面这样设置trustStore属性:
System.setProperty("javax.net.ssl.trustStore", trustStore);
trustStorePassword 属性
trustStorePassword属性是J2SE SDK 密码库的密码。在上一节,运行keytool的时候指定了默认密码changeit。客户端在下面的代码实例中设置trustStorePassword属性:
System.setProperty("javax.net.ssl.trustStorePassword", trustStorePassword);
Username和Password 属性
Username和Password属性对应管理员角色。客户端象下面这样设置Username和Password属性。
stub._setProperty(javax.xml.rpc.Stub.USERNAME_PROPERTY, username);
stub._setProperty(javax.xml.rpc.Stub.PASSWORD_PROPERTY, password);
基于SSL的交互认证
想要配置并创建具备交互认证的JAX-RPC服务,请执行"基于SSL的基本认证".中的步骤,然后执行下面的步骤:
1.以下代码示范了如何导出客户端证书
$Java_home/bin/keytool -export -alias -client -storepass changeit -file client.cer -keysnttore client.keystore
2.导入客户端证书到服务器的密码库
$Java_home/bin/keytool -import -v -trustcacerts -alias -client -file client.cert -keystore server.keystore -keypass changeit -storepass changeit
3.使用asant工具运行应用程序
asant run