博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WS Security 认证方式详解
阅读量:6968 次
发布时间:2019-06-27

本文共 3177 字,大约阅读时间需要 10 分钟。

本文参考文档如下:

MSDN 官方详解 : http://www.microsoft.com/china/MSDN/library/WebServices/WebServices/HowASP.NETWebServicesWork.mspx?mfr=true

WS安全规范说明 : https://www.oasis-open.org/committees/download.php/16782/wss-v1.1-spec-os-UsernameTokenProfile.pdf

WS Security 一些历史信息 : http://zh.wikipedia.org/wiki/WS-Security

如有不理解,请参考上面三个资源。

 

WS-Security 所涉及的三个方面:身份验证、签名和加密

1.身份验证

常用的的三种认证方法:

 

1.1用户名/密码

在Apache CXF中,可以使用如下定义来使用用户名密码认证:

客户端:

  以上的passwordType值为PasswordText时,则密码使用明文传输;为PasswordDigest时,则Password_Digest = Base64 ( SHA-1 ( nonce + created + password ) )

比如传输的SOAP报文为:

xxx
4t7Q2C0DnV21ie6ngsv6CwZ3vVw=
R+6n+Z5L6FaG8IqeDrLGXw==
2014-04-21T09:56:51.361Z
......

 

  则上面计算的Password_Digest的参数则来源于wsse:Security下面的各个节点参数值。

使用加密的密码传输,则客户端与服务端都需要指定一个passwordCallbackRef,该实现类继承CallbackHandler,下面做个示例

public class ClientMyPasswordCallback implements CallbackHandler {        private static final Log log = LogFactory.getLog(MyPasswordCallback.class);        /* (non-Javadoc)     * @see javax.security.auth.callback.CallbackHandler#handle(javax.security.auth.callback.Callback[])     */    public void handle(Callback[] callbacks) throws IOException,            UnsupportedCallbackException {        WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];                pc.setPassword("xxx");                    }    }

 

  服务端则使用:

public class ServerMyPasswordCallback implements CallbackHandler {        private static final Log log = LogFactory.getLog(MyPasswordCallback.class);        /* (non-Javadoc)     * @see javax.security.auth.callback.CallbackHandler#handle(javax.security.auth.callback.Callback[])     */    public void handle(Callback[] callbacks) throws IOException,            UnsupportedCallbackException {        WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];            //通过数据库得到该用户名的密码,这里略去该过程String password = getPwdByUname(pc.getIdentifier());          pc.setPassword(password );//直接设置从数据库得到的密码,WSS4J自动匹配该值与客户端传入的值,不需要调用pc.getPassword();因为它总是返回null                    }    }

  服务端的拦截器中匹配密码方式是自动的,不需要从pc.getPassword()得到密码自己匹配,由于加密算法比较麻烦,所以省去这一步应该是比较好的设计

 

X.509 证书与Kerberos则参考:

http://www.microsoft.com/china/MSDN/library/WebServices/WebServices/HowASP.NETWebServicesWork.mspx?mfr=true

文章里说明很清楚,不再重复。

 

2.签名

签名可以防止消息在传输中被篡改进行重复攻击等,可使用私钥对需要的部分进行签名,比如在上节的<身份认证>中,如果消息被截获,可导致重复攻击,

需要对请求设置过期时间(wsu:Timestamp->wsu:Expires)并签名。

 

3.消息包数据加密

若传输的消息属于高安全级别,则需要使用X.509 证书对消息加密,即客户端使用服务端的公钥加密,服务端通过私钥解包,消息包只能在知道服务端私钥情况下才能解开。

要对全部SOAP包加密,可启用SSL(通常为HTTPS)。

 

转载于:https://www.cnblogs.com/mikevictor07/p/3678535.html

你可能感兴趣的文章
shell date
查看>>
[Elasticsearch] 部分匹配 (一) - 前缀查询
查看>>
Spring内部bean无法通过id获取
查看>>
C# Use Pop3Client to read gmail
查看>>
相关Python分割操作
查看>>
Android 4.0 ICS SystemUI浅析——StatusBar结构分析
查看>>
linux 查看端口是否被占用
查看>>
设计模式之建造者模式
查看>>
Jmeter之逻辑控制器(Logic Controller)
查看>>
VS2010安装包制作全过程图解
查看>>
RS开发中的一些小技巧[不定期更新]
查看>>
Http与协议TCP协议简单易懂
查看>>
AndroidUI的组成部分GridView
查看>>
8000401a 错误 ,检索 COM 类工厂中 CLSID 为 的组件时失败,原因是出现以下错误: 8000401a。...
查看>>
实战SQL Server 2005镜像配置全过程
查看>>
安装ArchLinux BIOS
查看>>
使用 JavaScript 实现基本队列、优先队列和循环队列
查看>>
CSSREM插件
查看>>
安卓图表引擎AChartEngine(二) - 示例源码概述和分析
查看>>
python模块之imghdr(识别不同格式的图片文件)
查看>>