实现Axis web service 的数字证书认证(CLIENT-CERT)

本文参考自:J2EE Web服务开发系列之十二: 实现安全的AXIS Web服务,第1部分

 

package com.hellking.study.webservice;

public class PersonalTaxService {
    final double base = 3500;// 所得税上缴基数。

    public double getTax(double salary) {
        double tax_salary = salary - base;
        double tax = 0.0d;// 计算后的所得税。
        if (0 > tax_salary)
            tax = 0;
        else if (0 < tax_salary && tax_salary <= 1500)
            tax = tax_salary * 0.03 - 0;
        else if (1500 < tax_salary && tax_salary <= 4500)
            tax = tax_salary * 0.10 - 25;
        return tax;
    }
}

 布署web 服务

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    <service name="PersonalTaxService" provider="java:RPC">
  		<parameter name="allowedMethods" value="*"/>
  		<parameter name="className" value="com.hellking.study.webservice.PersonalTaxService"/>
	</service>
</deployment>

 执行命令:

java -classpath %CLASSPATH% org.apache.axis.client.AdminClient -l http://localhost:8080/axis/services/PersonalTaxService
 D:/workspace-java/axis1/web/WEB-INF/deploy_auth_client_cert.wsdd 

 

使web服务变为SSL的安全加密方式访问:

1、把以下命令粘贴到notepad里头,并保存为“gen-cer-store.bat”

 

rem CN:是指客户名称(first and last name)
rem OU:组织单位(organizational unit)
rem OU:组织(organizational )
rem L:城市或地点(City or Locality)
rem S:省份(State or Province)
rem C:两个字符的国家编码(two-letter country code)
set SERVER_DN="CN=linzq-notebook, OU=ec, O=ec, L=BEIJINGC, S=BEIJING, C=CN"
set CLIENT_DN="CN=linzq-notebook-client, OU=ec, O=ec, L=BEIJING, S=BEIJING, C=CN"
set PWD=123456
set VALIDITY=-validity 3650
set KS_PASS=-storepass %PWD%
set KEYINFO=-keyalg RSA

rem 创建服务器端的证书库(证书库包含密钥、公钥及实体信息)
keytool -genkey -alias Server -dname %SERVER_DN% %KS_PASS% -keystore server.keystore %KEYINFO% -keypass %PWD% %VALIDITY%
rem 从服务器端的密匙库中输出服务器端的RSA证书,用这个RSA证书生成客户端的信任库
keytool -export -alias Server -file server_key.cer %KS_PASS% -keystore server.keystore
rem 将服务器端的RSA证书导入到客户端的信任库中
keytool -import -file server_key.cer %KS_PASS% -keystore client.truststore -alias serverkey -noprompt

rem 创建客户端的证书库(证书库包含密钥、公钥及实体信息),并指定库类型为:PKCS12
keytool -genkey -alias Client -dname %CLIENT_DN% %KS_PASS% -storetype PKCS12 -keystore custom.p12 %KEYINFO% -keypass %PWD% %VALIDITY%
rem 从客户端的密匙库中输出客户端的RSA证书,用这个RSA证书生成服务器端的信任库
keytool -export -alias Client -file client_key.cer %KS_PASS% -keystore custom.p12 -storetype PKCS12 -rfc
rem 将客户端的RSA证书导入到服务器端的信任库中
keytool -import -file client_key.cer %KS_PASS% -keystore server.truststore -alias clientkey -noprompt

keytool -list -v -keystore server.keystore %KS_PASS%

keytool -list -v -keystore client.truststore %KS_PASS%

pause

 

 

 

2、编辑TOMCAT_HOME/conf/server.xml

 

<Connector port="8443" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" disableUploadTimeout="true"
               acceptCount="100" scheme="https" secure="true"
               keystoreFile="server.keystore" keystorePass="123456"
               truststoreFile="server.truststore" truststorePass="123456"
               clientAuth="true" sslProtocol="TLS" />

 

 

 

clientAuth="true" 表示服务端SSL椎栈要求在客户端连接前提供一个有效的证书链(验证客户端证书)

 

3、强制访问的地址使用SSL加密方式访问, 编辑/axis1/web/WEB-INF/web.xml,在最后添加上:

	<security-constraint>
		<!-- Authorization setting for SSL -->
		<web-resource-collection>
			<web-resource-name>SSL</web-resource-name>
			<url-pattern>/services/PersonalTaxService</url-pattern>
		</web-resource-collection>
		<user-data-constraint>
			<transport-guarantee>CONFIDENTIAL</transport-guarantee>
		</user-data-constraint>
	</security-constraint>
	<login-config>
		<!-- Authorization setting for SSL -->
		<auth-method>CLIENT-CERT</auth-method>
		<realm-name>Client Cert Users-only Area</realm-name>
	</login-config>

 最后编写客户端代码:

package com.hellking.study.webservice;

import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;

/**
 * 调用需要验证的Web服务
 */
public class AuthClient {
    static final double salary = 50000;

    public static void main(String[] args) {
        try {
            // 服务端的url,需要根据情况更改。
            String endpointURL = "https://localhost:8443/axis/services/PersonalTaxService";// Web服务端点地址
            Service service = new Service();
            Call call = (Call) service.createCall();
            call.setTargetEndpointAddress(new java.net.URL(endpointURL));
            call.setOperationName(new QName("PersonalTaxService", "getTax"));// 设置操作的名称。
            // 由于需要使用SSL认证,因此把用户名和密码注释掉了。
            //call.getMessageContext().setUsername("hellking");// 设置用户名。
            //call.getMessageContext().setPassword("simplewebservices");// 设置密码
            call.addParameter("op1", XMLType.XSD_DOUBLE, ParameterMode.IN);// 参数的类型
            call.setReturnType(XMLType.XSD_DOUBLE);// 返回的数据类型
            Double ret = (Double) call.invoke(new Object[] { new Double(salary) });// 执行调用
            System.out.println("使用HTTP协议来作为Web服务的传输协议!");
            System.out.println("已经成功调用。请参看服务端的输出!");
            System.out.println("输入工资" + salary + "元,应交个人所得税:" + ret);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

测试:

     1、访问:http://localhost:8080/axis/services,将列出web服务列表

点击PersonalTaxService 的wsdl链接地址,验证一下会不会提示需要导入客户端证进行认证。

 

那么当前需要从Firefox中导入客户端证书库。且这个证书库格式:PKCS

 

 

 

从网页访问的效果:

 

 

对在eclipse中运行“run configrations ”需要输入的参数为:

-Djavax.net.ssl.keyStore=D:/apache-tomcat-5.5.34/client.keystore -Djavax.net.ssl.keyStorePassword=123456  -Djavax.net.ssl.trustStore=D:/apache-tomcat-5.5.34/client.truststore

 

 

在命令行中运行就用以下命令:

java -cp %AXISCLASSPATH% -Djavax.net.ssl.keyStore=D:/apache-tomcat-5.5.34/client.keystore -Djavax.net.ssl.keyStorePassword=123456  -Djavax.net.ssl.trustStore=D:/apache-tomcat-5.5.34/client.truststore com.hellking.study.webservice.AuthClient

 

或者直接使用代码形式添加证书及密码:

package com.hellking.study.webservice;

import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;

/**
 * 调用需要验证的Web服务
 */
public class AuthClient {
    static final double salary = 50000;

    public static void main(String[] args) {
        try {
            // 配置证书地址及密码
            String keystorePassword="123456",truststorePassword="123456";
            String keystoreFile = "D:/apache-tomcat-5.5.34/client.keystore";
            String truststoreFile = "D:/apache-tomcat-5.5.34/client.truststore";
            System.setProperty("javax.net.ssl.keyStore", keystoreFile);
            System.setProperty("javax.net.ssl.keyStorePassword",keystorePassword);
            System.setProperty("javax.net.ssl.trustStore", truststoreFile);
            System.setProperty("javax.net.ssl.trustStorePassword",truststorePassword); 
            
            // 服务端的url,需要根据情况更改。
            String endpointURL = "https://localhost:8443/axis/services/PersonalTaxService";// Web服务端点地址
            Service service = new Service();
            Call call = (Call) service.createCall();
            call.setTargetEndpointAddress(new java.net.URL(endpointURL));
            call.setOperationName(new QName("PersonalTaxService", "getTax"));// 设置操作的名称。
            // 由于需要使用SSL认证,因此把用户名和密码注释掉了。
            //call.getMessageContext().setUsername("hellking");// 设置用户名。
            //call.getMessageContext().setPassword("simplewebservices");// 设置密码
            call.addParameter("op1", XMLType.XSD_DOUBLE, ParameterMode.IN);// 参数的类型
            call.setReturnType(XMLType.XSD_DOUBLE);// 返回的数据类型
            Double ret = (Double) call.invoke(new Object[] { new Double(salary) });// 执行调用
            System.out.println("使用HTTP协议来作为Web服务的传输协议!");
            System.out.println("已经成功调用。请参看服务端的输出!");
            System.out.println("输入工资" + salary + "元,应交个人所得税:" + ret);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

df

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值