2012-05-29 27 views
1

我正在尝试为WCF WS-Security部署Android 3.0客户端。 WCF WS将用户名令牌实现为安全访问。 我用KSOAP2和我没有问题,进入到一个ASMX服务,但是当我尝试拨打电话到WCF WS应用程序将引发此异常:用于WCF的Android客户端使用用户名令牌进行wshttp绑定

javax.net.ssl.SSLHandshakeException:java.security。 cert.CertPathValidatorException:找不到证书路径的信任锚点。

看起来这是证书凭证,但我已将服务器凭证添加到我的项目使用的密钥库中。

这是代码关闭我的客户:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    System.setProperty("http.keepAlive", "false"); 
    try { 
    /**String NAMESPACE = "http://tempuri.org/"; 
    String URL = "http://**host**/ObtenerDatos/ServicioDatos.asmx"; 
    String METHOD_NAME = "SumadorDatos"; 
    String SOAP_ACTION = "http://tempuri.org/SumadorDatos";*/ 
    String NAMESPACE = "https://tempuri.org/"; 
    String URL = "http://**host**//WCFServicio/SWObtenerDatos.svc"; 
    URL url = new URL(URL); 
    String METHOD_NAME = "MetodoEnWS"; 
    String SOAP_ACTION = "http://tempuri.org/IObtenerDatos/MetodoEnWS"; 
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);  
    request.addProperty("xmlPeticion","dato"); 
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
    envelope.dotNet = true; 
    envelope.setOutputSoapObject(request); 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();  
    StrictMode.setThreadPolicy(policy); 

    KeepAliveHttpsTransportSE transporte = new KeepAliveHttpsTransportSE(url.getHost(),url.getPort(),"",6000); 
    try{ 

     transporte.call(SOAP_ACTION, envelope); 

    try { 
     SoapPrimitive resultado = (SoapPrimitive)envelope.getResponse(); 
     String res = resultado.toString(); 
     TextView tv = new TextView(this); 
     tv.setText("El Resultado es: " + res);  
     setContentView(tv); 
    } catch (SoapFault e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    } catch (MalformedURLException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    }catch(Exception ex){ 
     ex.printStackTrace(); 
     this.closeContextMenu(); 
    } 


} 

第二个问题。

我不知道如何发送到服务器的用户名令牌和密码到服务器。我是否必须为自己添加标题创建一个soap信封,或者是否存在像.net这样的方法,其中给出用户名的值并将其传递给特定的对象?

回答

0

对于添加属性为标题,你必须做这样的事情:

 Element[] header = new Element[2]; 
    header[0] = new Element().createElement(NAMESPACE, "username");     
    header[0].addChild(Node.TEXT, "Your username"); 

    header[1] = new Element().createElement(NAMESPACE, "password");     
    header[1].addChild(Node.TEXT, "Your Password"); 

    envelope.headerOut = header;         

证书,你可以加入这一行:

HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); 
    conn.setHostnameVerifier(new HostnameVerifier() { 
     @Override 
     public boolean verify(String arg0, SSLSession arg1) { 
      return true; 
     } 
    }); 

所以你接受所有证书