2

我知道 Apache Rampart 配置允许提供密码回调处理程序类,可用于提供 Rampart 引擎构建用户名令牌和在发送消息时创建签名所需的密码。它写道,每当 Rampart Engine 需要密码来创建用户名令牌时,它将创建一个 WSPasswordCallback 实例,设置它从 Rampart 配置的参数中提取的适当标识符,并通过 handle 方法将其传递给密码回调类。但正如你所见,我使用了基于策略的配置!

所以我有几个问题想看看我是否理解了所有这些:

  1. 我是从这里壁垒引擎提取适当的用户名的地方吗?wsse:Username>bob</wsse:Username>'+

  2. 在它提取它之后,它通过句柄方法将它传递给我们的 PWCBHandler 类。如果用户名正确,我们的 handle 方法会设置适当的密码。

  3. 最重要的是——因为我必须在最后通过 javascript 使用我的 web 服务,所以我提供了我的 soap 请求。但是正如您所看到的,我同时提供了用户名和密码,但我看不到安全性在哪里,因为每个人都可以看到我的用户名和密码。这是正确的吗。我怎样才能使它更安全。

这是我的代码。


  1. 这是我的 PassWordCallback.java 类的代码

    ublic void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { for (int i = 0; i < callbacks.length; i++) {

             WSPasswordCallback pwcb = (WSPasswordCallback)callbacks[i];
            if(pwcb.getIdentifier().equals("test") &&pwcb.getPassword().equals("pass")) {
                return;
             } 
    
            else {
                throw new UnsupportedCallbackException(callbacks[i],"Incorrect login/password");
             }
         }
     }
    

这是我来自javascript的soaprequest

 "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                "<soapenv:Envelope " + 
                     "xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" " +
                     "xmlns:tan=\"http://tan\">"+
                    "<soapenv:Header>"+
                     '<wsse:Security xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\" soapenv:mustUnderstand="1">'+
'<wsse:UsernameToken xmlns:wsu="http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="123">'+
'<wsse:Username>bob</wsse:Username>'+
'<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">bobPW</wsse:Password>'+
'</wsse:UsernameToken>'+
'</wsse:Security>'+
"</soapenv:Header>"+
                    "<soapenv:Body>" +
                     "<tan:testws>" +
                     '<tan:x>ECHOO</tan:x>' +
                      ' </tan:testws>'+

                    '</soapenv:Body>' +
                '</soapenv:Envelope>';
4

1 回答 1

2

我先回答你的第三个问题

您正在使用用户名令牌身份验证方法对服务进行身份验证。为了提供安全性,您需要使用 https 传输而不是 http。通过这种方式,您可以提供传输级别的安全性并隐藏您的密码。可以在这里找到一些不错的阅读http://wso2.com/library/3190/

如果您使用不安全的通道(比如 http),那么您可以加密密码。用户可以使用随机字节(nounce)创建密码摘要。为了验证请求,服务将使用绑定到接收到的用户名的密码计算摘要值,并将接收到的摘要值和计算的摘要值进行比较。安全标头将被更改。可以在此找到一些详细信息。http://wso2.com/library/240/。为了提供更高的安全性,您可以加密消息(http://wso2.com/library/3415/

对于问题 1,它没有从 wsse:Username 获取用户名。它从 Rampart 配置的参数中提取用户名。此配置可以从外部加载或使用 java

RampartConfig rc = new RampartConfig();
rc.setUser("admin");
rc.setPwCbClass(PWDCallBackHandler.class.getName()); 

有关回调处理程序http://wso2.com/library/3733/的一些信息

对于问题 2:是的

于 2014-04-21T10:07:21.157 回答