2012-01-25 5 views
0

私はこのリンクからアンドロイドアプリケーションでXML-RPCサーバーとクライアントを使用します:http://www.codeforest.net/how-to-build-php-xml-rpc-server-client-and-android-app通信はHTTP経由です。 HTTPS経由で通信するためにAndroidコードで何をどこで変更しなければならないか、私に説明できますか?ありがとう(私はstackoverflowの多くの記事を読んだが、私はアンドロイドコードでそれを使用する方法を知ることができません)HTTPS通信を使用するためのandroidアプリケーションのxml-rpcの変更

答えて

1

これが私の解決策であるとit'sが正常に動作:

//In class XMLRPCClient 
    public XMLRPCClient(URI uri) { 
        SchemeRegistry registry = new SchemeRegistry(); 
        registry.register(new Scheme("http", new PlainSocketFactory(), 
          80)); 
        registry.register(new Scheme("https", new EasySSLSocketFactory(), 443)); 

        postMethod = new HttpPost(uri); 
        postMethod.addHeader("Content-Type", "text/xml"); 

        // WARNING 
        // I had to disable "Expect: 100-Continue" header since I had 
        // two second delay between sending http POST request and POST body 
        httpParams = postMethod.getParams(); 
        HttpProtocolParams.setUseExpectContinue(httpParams, false); 
        this .client = new DefaultHttpClient(
          new ThreadSafeClientConnManager(httpParams, registry), 
          httpParams); 
       } 

そして2クラスEasySSLSocketFactoryとEasyX509TrustManager

EasySSLSocketFactory org.xmlrpc.androidに追加する必要があります。

package org.xmlrpc.android; 

/* 
* Licensed to the Apache Software Foundation (ASF) under one 
* or more contributor license agreements. See the NOTICE file 
* distributed with this work for additional information 
* regarding copyright ownership. The ASF licenses this file 
* to you under the Apache License, Version 2.0 (the 
* "License"); you may not use this file except in compliance 
* with the License. You may obtain a copy of the License at 
* 
* http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, 
* software distributed under the License is distributed on an 
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
* KIND, either express or implied. See the License for the 
* specific language governing permissions and limitations 
* under the License. 
*/ 

import java.io.IOException; 
import java.net.InetAddress; 
import java.net.InetSocketAddress; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import javax.net.ssl.SSLContext; 
import javax.net.ssl.SSLSocket; 
import javax.net.ssl.TrustManager; 

import org.apache.http.conn.ConnectTimeoutException; 
import org.apache.http.conn.scheme.LayeredSocketFactory; 
import org.apache.http.conn.scheme.SocketFactory; 
import org.apache.http.params.HttpConnectionParams; 
import org.apache.http.params.HttpParams; 

/** 
* This socket factory will create ssl socket that accepts self signed certificate 
* 
* @author olamy 
* @version $Id: EasySSLSocketFactory.java 765355 2009-04-15 20:59:07Z evenisse $ 
* @since 1.2.3 
*/ 
public class EasySSLSocketFactory implements SocketFactory, LayeredSocketFactory { 

    private SSLContext sslcontext = null; 

    private static SSLContext createEasySSLContext() throws IOException { 
     try { 
      SSLContext context = SSLContext.getInstance("TLS"); 
      context.init(null, new TrustManager[] { new EasyX509TrustManager(null) }, null); 
      return context; 
     } catch (Exception e) { 
      throw new IOException(e.getMessage()); 
     } 
    } 

    private SSLContext getSSLContext() throws IOException { 
     if (this.sslcontext == null) { 
      this.sslcontext = createEasySSLContext(); 
     } 
     return this.sslcontext; 
    } 

    /** 
    * @see org.apache.http.conn.scheme.SocketFactory#connectSocket(java.net.Socket, java.lang.String, int, 
    *  java.net.InetAddress, int, org.apache.http.params.HttpParams) 
    */ 
    public Socket connectSocket(Socket sock, String host, int port, InetAddress localAddress, int localPort, 
      HttpParams params) throws IOException, UnknownHostException, ConnectTimeoutException { 
     int connTimeout = HttpConnectionParams.getConnectionTimeout(params); 
     int soTimeout = HttpConnectionParams.getSoTimeout(params); 
     InetSocketAddress remoteAddress = new InetSocketAddress(host, port); 
     SSLSocket sslsock = (SSLSocket) ((sock != null) ? sock : createSocket()); 

     if ((localAddress != null) || (localPort > 0)) { 
      // we need to bind explicitly 
      if (localPort < 0) { 
       localPort = 0; // indicates "any" 
      } 
      InetSocketAddress isa = new InetSocketAddress(localAddress, localPort); 
      sslsock.bind(isa); 
     } 

     sslsock.connect(remoteAddress, connTimeout); 
     sslsock.setSoTimeout(soTimeout); 
     return sslsock; 

    } 

    /** 
    * @see org.apache.http.conn.scheme.SocketFactory#createSocket() 
    */ 
    public Socket createSocket() throws IOException { 
     return getSSLContext().getSocketFactory().createSocket(); 
    } 

    /** 
    * @see org.apache.http.conn.scheme.SocketFactory#isSecure(java.net.Socket) 
    */ 
    public boolean isSecure(Socket socket) throws IllegalArgumentException { 
     return true; 
    } 

    /** 
    * @see org.apache.http.conn.scheme.LayeredSocketFactory#createSocket(java.net.Socket, java.lang.String, int, 
    *  boolean) 
    */ 
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, 
      UnknownHostException { 
     return getSSLContext().getSocketFactory().createSocket(socket, host, port, autoClose); 
    } 

    // ------------------------------------------------------------------- 
    // javadoc in org.apache.http.conn.scheme.SocketFactory says : 
    // Both Object.equals() and Object.hashCode() must be overridden 
    // for the correct operation of some connection managers 
    // ------------------------------------------------------------------- 

    public boolean equals(Object obj) { 
     return ((obj != null) && obj.getClass().equals(EasySSLSocketFactory.class)); 
    } 

    public int hashCode() { 
     return EasySSLSocketFactory.class.hashCode(); 
    } 

} 

EasyX509TrustManagerを:

package org.xmlrpc.android; 

import java.security.KeyStore; 
import java.security.KeyStoreException; 
import java.security.NoSuchAlgorithmException; 
import java.security.cert.CertificateException; 
import java.security.cert.X509Certificate; 

import javax.net.ssl.X509TrustManager; 

class EasyX509TrustManager implements X509TrustManager 
{ 
    public EasyX509TrustManager(KeyStore keystore) throws NoSuchAlgorithmException, KeyStoreException { 
     super(); 

    } 
@Override 
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException 
{ 

} 

@Override 
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException 
{ 

} 

@Override 
public X509Certificate[] getAcceptedIssuers() 
{ 
return new X509Certificate[0]; 
} 
} 
0

それはちょうどhttpsでうまくいくはずです。 httpsで始まるようにURLを変更するだけです。

注:SSL証明書が信頼できる証明書でない場合は、それに対処するロジックを記述する必要があります。ただし、証明書がデバイスと一緒に使用される場合は、他の変更は必要ありません。

+0

はい、私の証明書は信頼されていません。手伝って頂けますか?何を元気に変えなければならないのですか? – Pedro

+0

@Pedro完璧なソリューション。私も同じ問題に直面していて、XML-RPCエラーを取得していましたが、私はあなたのソリューションを試してみましたが、今は魅力的です。 – YuDroid

関連する問題