快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

伟德官伟德官网手机版_酒文化网进入



一、WSSecurity简述

安然的Web办事是Web办事成功的需要包管。但大年夜家都知道,Web办事应用XML来进行数据互换,而XML在默认环境下是明文编码的;同时,大年夜部分Web办事应用HTTP协议作为传输协议,同样,HTTP也是应用明文要领来传输数据的。这就造成了在不加密的传输协议上传输不加密的信息,从而使信息传输的保密性受到要挟。作为企业级的利用,以上的要领不能满意安然性基础要求:

²数据在internet上传输的时侯是不应该被第三方能够看到的;

²双方必须能够验定彼此间的滥觞;

²双方必须能够确定被传送的数据没有被在半途中遭到黑客的改动。

经由过程应用SSL协议我们可以办理第一个问题即:"不应该被第三方看到";应用数字署名和数字证书可以办理后面的两个问题。当应用数字证书措施时,Web 办事哀求者必须有一个由可托认证中间签署的数字证书。哀求者应用这个证书来注解它们的身份,并对 SOAP 消息进行数字署名。对方系统接管到消息后,就可对消息做光阴戳记并进行日志记录。此时,数字署名会获得验证。验证历程将确保消息来自发送方,并且还要验证消息内容在传输历程中没有被窜改。

IBM、Microsoft 和 Verisign 于2002年十仲春份联合宣布了一个关于 Web 办事安然性(Web Services Security,WS-Security)的规范,该规范描述若何向 SOAP 消息附加署名和加密报头;别的,它还描述若何向消息附加安然性令牌(包括二进制安然性令牌,如 X.509 证书),供给了一套赞助 Web 办事开拓者保护 SOAP 消息互换的机制。

根据利用的对安然要求的级别不合,可以采纳不合的要领来实现安然性,以下是今朝最常用的一些实现要领(从低到高排列):

²J2EE Web利用默认的造访节制(数据是明文的);

²应用axis的Handler进行造访节制(数据是明文的);

²应用Servlet过滤器(Filter)进行造访节制(数据是明文的);

²应用SSL/HTTPS协议来传输(加密的数据传输协议);

²应用WS-Security规范对信息进行加密与身份认证(数据被加密传输)。

前三种要领对付安然级别要求不高的利用是可行的,它能够应用Web利用造访认证机制来进行权限验证,从而伟德官伟德官网手机版保护对资本的造访。但必要留意的是,虽然它们进行了身份验证,但信息的通报照样以明文的要领进行的,不能包管信息在传输历程中不被偷取。SSL是一个安然的传输协议,应用它传输Web办事能包管信息不被第三方偷取。但它有个毛病便是对系统资本耗损大年夜。采纳着末一种要领,信息被署名后再加密,然后把加密后的信息收集上传播,这样,纵然第三方得到加密后的传输信息,也不能解密。对付安然级别要求高的系统,应该采纳WS-Security规范来作为Web办事安然性办理规划。

二、基于https通信并且应用用户名密码来验证的WS

在一样平常的利用中,我们可以经由过程https来保护我们传输的明文数据。

关键在于我们必要来验证这个客户端过来的哀求,即必要具有基础的用户名,密码才能造访我的Web Service,我们称之为Basic Auth。

2.1 差错做法

在很多项目中,有些开拓步队为了图省事,客户对情况的掌控也不好,为了验证一个webservice,我们每每会采纳以下这样的验证伎俩:

第一种:

http://xxxx.xxx.xxx/abc.wsdl?username=验证个头&password=验证个头

办事端拿到这个url把username,password用request.getParameter出来后,和数据库一匹配,验证。

第二种:

验证个头啊

不要总是你个头你个头

2007-01-01

办事端拿到后把这个soap request body中的和

拿出来后和数据库一匹配,又验证了!

这两种做法,无疑是掩耳盗铃!!!(不要和我说营业实现是最主要的,等你的数据哪天没了,厂长经理的人为被窜改了,假如你乐意被客户做成东方不败,那你只管去这样做就好了。)

2.2 精确的做法

经由过程上图我们可以看到,假如你的用户名和密码和办事端预设的用户名密码假如不匹配,你的“调用”,根本到达不了详细的Web Service,直接在Web Server端已经被打回来了,即你连wsdl都到达不了。

三、实际例子

3.1 Service端

我们编写一个Service端

org.sky.axis2.security.SimpleAuthService

package org.sky.axis2.security;

public class SimpleAuthService {

public double getTax(double salary) {

// System.out.println("input salary=====" + salary);

if (salary > 10000) {

return 2000;

} else if (salary > 1000 && salary

service.xml文件的内容

Please Type your service description here

org.sky.axis2.security.SimpleAuthService

urn:伟德官伟德官网手机版getTax

最紧张的来了

改动web.xml文件,增添以下的内容

Simple Authenticate Web service

/services/SimpleAuthService

bank_member

BASIC

Axis Basic Authentication Area

bank_member

我们可以看到:

l只有在办事端属于bank_member角色(组)中的职员才被容许造访该web service即:SimplAuthService。

l而且,该该造访采纳“BASIC”模式,即必要用户名和密码来进行造访。

随后,我们打开tomcat所在目录下的conf目录下的tomcat-users.xml如我的是“D:\tomcat\conf\tomcat-users.xml”。

在文件中加入如下内容(留意血色加粗的部分):

然后我们来布署我们的web service。

布署后我们启动我们的tomcat,造访:http://localhost:8080/Axis2Service/services/listServices

我们来点这个SimpleauthService,然后我们可以看到我们的浏览器弹出一个对话框

我们输入刚才在tomcat的tomcat-users.xml中定义的Wright这个用户,即

用户名:Wright

密码: abcdefg

留意大年夜小写要区分啊!

然后获得wsdl的输出:

假如我们在用户名和密码处输错一个字符,我们将会被迫停顿在此对话框上,而得不到我们相要的wsdl的精确输出:

然后我们试着点[取消]按钮,我们将获得

3.2 制作client端前的筹备

我们前面说过了,我们必要应用https来保护我们传输的用户名和密码,即Wright/abcdefg这个认证。

是以,我们必要实现一个单向的https。

还记得我们在第二天“apache tomcat https利用”中所说的那个办事端与客户端与CA之间的互信关系是若何构成的吗?我们来重温一下,看下面这个图:

1)因为办事端是我由我们的CA即RootCA签发的;

2)而我们的客户真个根相信域内装着我们的RootCA这张证书;

3)是以当我们的客户端去造访我们的办事端时,客户端client和办事端之间搭成了“互信”;

我们来重温一下这个情况搭建的历程。

3.2.1 制作CA

1)先孕育发生KEY

openssl genrsa -des3 -out shnlap93.key 1024

2)经由过程key孕育发生ca证书

我们天生了一个有效日期为3650天(10年)的RootCA。

留意:

假如不加这个-days参数,默认孕育发生的证书文件的有效期为30天,即一个月的有效期。

3.2.2 制作tomcat的证书即jks款式文件

1)孕育发生shnlap93.jks文件

keytool -genkey -alias shnlap93X509 -keyalg RSA -keysize 1024 -dname "CN=shnlap93, OU=insurance, O=CTS, L=SH, S=SH, C=CN" -keypass aaaaaa -keystore shnlap93.jks -storepass aaaaaa

2)经由过程JKS孕育发生csr(证书哀求)文件

3)应用我们的RootCA署名该csr文件并天生crt(证书文件)

4)将RootCA作为“相信域”即trustcacerts导入原本的jks文件

5)将被署名后的证书文件导入原本的jks文件

这样,我们勾成了上述的“三角形”互信关系,就可以把这个shnlap93.jks文件扔给tomcat,然后改动tomcat的conf目录下的server.xml文件。

随后我们启动tomcat。

假如获得上面截图中白色方框标出的输出的话则代表我们的tomcat已经以https要领在运行了。

3.2.3 将RootCA导入IE的根证书列表中去

按[导入],选择我们的ca.crt文件。

然后我们在IE中打入:https://shnlap93:8443/Axis2Service/services/SimpleAuthService?wsdl

因为是https绑定证书文件中的CN(Common Name),是以此时我们必须应用“主机名”来代替原本的IP地址来造访。

在弹出的必要输入用户名和密码的对话框中输入”Wright/abcdefg”,我们即可获得如下的输出:

我们可以看到,该证书是有效证书,而不会弹出一个“你是否相信”一类的对话框再次让你确认是否信托该https连接了。其缘故原由就在于

由于我们在我们的IE浏览器中已经建立起下述这样的一个三角互信关系来了:

1)因为办事端是我由我们的CA即RootCA签发的;

2)而我们的客户真个根相信域内装着我们的RootCA这张证书;

3) 是以当我们的客户端去造访我们的办事端时,客户端client和办事端之间搭成了“互信”;

3.3 必要为我们的Axis2的调用客户端也建立起https中的互信

上面是我们打开一个IE后造访https的链接所必要的步骤,现在我们这样来想:

l我们现在将要运行的是一个Java利用法度榜伟德官伟德官网手机版样;

l该利用法度榜样将经由过程https这样的链接来造访我们的tomcat中的webservice;

而不再是一个IE来造访我们的web service喽!!!

那么,我们应该为我们的Java利用法度榜样,也设置设置设备摆设摆设一个上述这样的三角相信关系,对纰谬?

先来看下面这个示例图,和IE端设置设置设备摆设摆设相信关系稍稍有点不一样

因为我们的是一个Java利用法度榜样,是以我们的利用法度榜样必要带着一个jks文件,我们把它称为client.jks吧。

这个client.jks文件的trustcacerts域里,只要带有RootCA的信息,是不是这个client就可以在造访我们的办事器时,和我们的办事器也建立起一个三角互信关系了?

我们来着手吧,只必要两步即可。

1)建立客户端所需的JKS文件

这边的密码,我用的是六个b,和办事真个证书的密码区分开来。

1)将RootCA作为“相信域”即trustcacerts导入客户真个jks文件

keytool -import -alias rootca -trustcacerts -file ca.crt -keystore shnlap93client.jks -storepass bbbbbb

这样,这个客户真个jks文件我们就可以给我们的axis2的客户端用了。

3.4 调用客户端

先将shnlap93client.jks放置在我们工程的src目录,使得这个jks文件会被自动编译到classpath下。

org.sky.axis2.security.SimpleAuthClient

package org.sky.axis2.security;

import java.net.URL;

import java.util.ArrayList;

import java.util.List;

import javax.xml.namespace.QName;

import org.apache.axiom.om.OMAbstractFactory;

import org.apache.axiom.om.OMElement;

import org.apache.axiom.om.OMNamespace;

import org.apache.axiom.soap.SOAPBody;

import org.apache.axiom.soap.SOAPEnvelope;

import org.apache.axiom.soap.SOAPFactory;

import org.apache.axis2.addressing.EndpointReference;

import org.apache.axis伟德官伟德官网手机版2.client.OperationClient;

import org.apache.axis2.client.Options;

import org.apache.axis2.client.ServiceClient;

import org.apache.axis2.context.MessageContext;

import org.apache.axis2.transport.htt伟德官伟德官网手机版p.HTTPConstants;

import org.apache.axis2.transport.http.HttpTransportProperties.Authenticator;

import org.apache.axis2.wsdl.WSDLConstants;

public class SimpleAuthClient {

private static EndpointReference targetEPR = new EndpointReference(

"https://shnlap93:8443/Axis2Service/services/SimpleAuthService");

private final static String usr = "Wright";

private final static String pwd = "abcdefg";

private final static String jksFile = "shnlap93client.jks";

private final static String jksFilePWD = "bbbbbb";

private String getJskFilePath() {

String filePath = "";

ClassLoader classLoader = Thread.currentThread()

.getContextClassLoader();

URL url = classLoader.getResource(jksFile);

if (url == null) {

classLoader = ClassLoader.getSystemClassLoader();

url = classLoader.getResource(jksFile);

}

filePath = url.getPath();

System.out.println(filePath);

return filePath;

}

public void getTax() {

System.setProperty("javax.net.ssl.trustStore", getJskFilePath());// //

System.setProperty("javax.net.ssl.trustStorePassword", jksFilePWD);

ServiceClient sender = null;

Authenticator authenticator = new Authenticator();

List auth = new ArrayList();

auth.add(Authenticator.BASIC);

authenticator.setAuthSchemes(auth);

authenticator.setUsername(usr);

authenticator.setPassword(pwd);

authenticator.setPreemptiveAuthentication(true);

Options options = new Options();

options.setTo(targetEPR);

options.setAction("urn:getTax");

options.setProperty(HTTPConstants.AUTHENTICATE, authenticator);

try {

sender = new ServiceClient();

sender.setOptions(options);

OperationClient mepClient = sender

.createClient(ServiceClient.ANON_OUT_IN_OP);

MessageContext mc = new MessageContext();

SOAPFactory fac = OMAbstractFactory.getSOAP11Factory();

SOAPEnvelope env = fac.getDefaultEnvelope();

OMNamespace omNs = fac.createOMNamespace(

"http://security.axis2.sky.org", "");

OMElement getTax = fac.createOMElement("getTax", omNs);

OMElement salaryEle = fac.createOMElement("salary", omNs);

salaryEle.setText("2100");

getTax.addChild(salaryEle);

env.getBody().addChild(getTax);

mc.setEnvelope(env);

mepClient.addMessageContext(mc);

System.out.println("message====" + env);

mepClient.execute(true);

MessageContext response = mepClient

.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE);

SOAPBody body = response.getEnvelope().getBody();

OMElement element = body.getFirstElement().getFirstChildWithName(

new QName("http://security.axis2.sky.org", "return"));

System.out.println(element.getText());

} catch (Exception e) {

e.printStackTrace();

} finally {

if (sender != null)

try {

sender.cleanup();

} catch (Exception e) {

}

}

}

public static void main(String[] args) {

SimpleAuthClient client = new SimpleAuthClient();

client.getTax();

}

}

留意血色标粗的部分,由其是:

System.setProperty("javax.net.ssl.trustStore", getJskFilePath());// //

System.setProperty("javax.net.ssl.trustStorePassword", jksFilePWD);

因为https必要经由过程client的jks与server的jks建立起三角互信关系,是以我们必要经由过程法度榜样去造访这个jks文件,造访这个jks文件我们必要知道:

1)该jks所在路径;

2)该jks的密码(六个b);

对吧?

Authenticator authenticator = new Authenticator();

List auth = new ArrayList();

auth.add(Authenticator.BASIC);

authenticator.setAuthSchemes(auth);

authenticator.setUsername(usr);

authenticator.setPassword(pwd);

authenticator.setPreemptiveAuthentication(true);

options.setProperty(HTTPConstants.AUTHENTICATE, authenticator);

上述代码做的事便是把“Wright/abcdefg”这对用户名及密码,set到一个Authenticator工具中去,然后将该工具与必要造访的soap request进行绑定。

然后我们来看运行结果:

我们把:

privatefinal static String usr = "Wright";

privatefinal static String pwd = "abcdefg";

中的任何一个值篡改一下比如说我们把usr改成”abc”,然后再来看运行结果。

留意到这个org.apache.axis2.AxisFault: Transport error: 401 Error: Unauthorized

了吗?

再来对照我们在浏览器中确当弹出要求输入的用户名和密码的对话框时,我们点[取消]按钮获得的输出:

明白了吧?

这便是基于用户名密码且经由过程https来造访web service的具体历程。

然则这种措施的毛病是,用户名和密码照样以明文要领传输,且用户名和密码是预先设置设置设备摆设摆设在web server真个。

今后我们会将用户名密码以加密形式传输且是动态从数据库中获取的web service的认证。

停止本篇教程!!!

转自:http://blog.csdn.net/lifetragedy/article/details/7823435

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: