6

ksoap2-androidを使用して、SSL経由でwcfサービスを呼び出しています。SSLなしでも動作させることができますが、SSL経由で電話をかけたいのですが、いくつか問題が発生しました。

HttpTransportSEの代わりにHttpsTransportSEを使用していますが、次のエラーが発生します:javax.net.ssl.SSLException:信頼されていないサーバー証明書

どうすればこれを修正できますか?

問題を解決するために、Androidのキーストアにサーバー証明書を追加できますか?

private static final String SOAP_ACTION = "http://example.com/Service/GetInformation";
private static final String METHOD_NAME = "GetInformation";
private static final String NAMESPACE = "http://example.com";    
private static final String URL = "dev.example.com/Service.svc";

public static Result GetInformation()
{
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

    PropertyInfo property = new PropertyInfo();
    property.name = "request";

    Request request =
        new Request("12", "13", "Ben");

    userInformationProperty.setValue(request);
    userInformationProperty.setType(request.getClass());
    request.addProperty(property);

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.setOutputSoapObject(request);
    envelope.addMapping(NAMESPACE, "Request",new Request().getClass());

    HttpsTransportSE transport = new HttpsTransportSE(URL, 443, "", 1000);

    //HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
    transport.debug = true;

    try
    {
        transport.call(SOAP_ACTION, envelope);          
        return Result.FromSoapResponse((SoapObject)envelope.getResponse());
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    catch (XmlPullParserException e)
    {
        e.printStackTrace();
    }

    return null;
}
4

4 に答える 4

11

Vedran の回答をいくつかのソース コードで補完するために、申し訳ありませんがコメントできません。

トラストマネージャー:

private static TrustManager[] trustManagers;

public static class _FakeX509TrustManager implements
        javax.net.ssl.X509TrustManager {
    private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {};

    public void checkClientTrusted(X509Certificate[] arg0, String arg1)
            throws CertificateException {
    }

    public void checkServerTrusted(X509Certificate[] arg0, String arg1)
            throws CertificateException {
    }

    public boolean isClientTrusted(X509Certificate[] chain) {
        return (true);
    }

    public boolean isServerTrusted(X509Certificate[] chain) {
        return (true);
    }

    public X509Certificate[] getAcceptedIssuers() {
        return (_AcceptedIssuers);
    }
}

public static void allowAllSSL() {

    javax.net.ssl.HttpsURLConnection
            .setDefaultHostnameVerifier(new HostnameVerifier() {
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });

    javax.net.ssl.SSLContext context = null;

    if (trustManagers == null) {
        trustManagers = new javax.net.ssl.TrustManager[] { new _FakeX509TrustManager() };
    }

    try {
        context = javax.net.ssl.SSLContext.getInstance("TLS");
        context.init(null, trustManagers, new SecureRandom());
    } catch (NoSuchAlgorithmException e) {
        Log.e("allowAllSSL", e.toString());
    } catch (KeyManagementException e) {
        Log.e("allowAllSSL", e.toString());
    }
    javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(context
            .getSocketFactory());
}

メソッドでの呼び出し:

allowAllSSL();
HttpsTransportSE httpsTransport = new HttpsTransportSE(Server,443, URL, 1000);

ノート:

  1. サーバーはサーバーの URL です。
  2. 443 がデフォルトの https ポートです。コンストラクターがポートを想定しているため、ポートを指定する必要があります。
  3. WS 操作へのパスの URL
  4. 1000 es タイムアウト

[https://Server:443/URL] のように構成されます。

于 2012-08-02T22:23:47.567 に答える
4

HttpsServiceConnectionSE を変更する代わりに、これを行う簡単な方法があります。http://groups.google.com/group/android-developers/browse_thread/thread/1ac2b851e07269ba/c7275f3b28ad8bbc?lnk=gst&q=certificateで説明されているように偽のトラスト マネージャーをインストールし、SSL を実行する前に allowAllSSL() を呼び出すことができます。 ksoap2 への通信/呼び出し。新しいデフォルトの HostnameVerifier と TrustManager を登録します。ksoap2 は、SSL 通信を行うときにデフォルトのものを使用し、魅力的に機能します。

また、これにもう少し力を入れて (はるかに) 安全にし、証明書をアプリケーションのローカルの信頼マネージャーにインストールすることもできます。私は安全なネットワークにいて、中間者攻撃を恐れていなかったので、最初の攻撃を行いました.

このように KeepAliveHttpsTransportSE を使用する必要があることがわかりましたnew KeepAliveHttpsTransportSE(host, port, file, timeout);。パラメータは URL オブジェクトに入ります。たとえば、Jira インストールにアクセスするには、new KeepAliveHttpsTransportSE("host.whatever", 443, "/rpc/soap/jirasoapservice-v2", 1000).

エミュレーターやデバイスではなく、J2SE 環境で試してみたいテクノロジや Web サービスに慣れていない場合に便利な場合がありますが、J2SE/ME ksoap2 ライブラリでは (KeepAlive) HttpsTransportSE がありません (ksoap2-j2se-full-2.1.2.jar を使用しました)。できることは、Android のスピンオフである ksoap2-android から 3 つのクラス HttpsTransportSE、KeepAliveHttpsTransportSE、および HttpsServiceConnectionSE のソースを取得し、それらを J2SE プロジェクトに配置して使用することです。それは私にとってはうまくいき、未知の非常に複雑な Web サービスで最初のステップを正しく行うことが生産性の向上になりました。

于 2011-01-24T07:54:01.533 に答える
0

はい、おそらくこれを試すことができます

https 接続 Android

これに関して、Issue Tracker にバグが報告されています。

http://code.google.com/p/android/issues/detail?id=2388

于 2011-01-10T11:08:37.157 に答える