通过Restlet在Android上使用自签名证书进行Https

时间:2014-06-22 15:34:00

标签: android ssl restlet self-signed

我试图用RestLet实现简单的Androd客户端作为我的论文.Evrything在HTTP上工作得很好但我必须通过HTTPS使用自签名证书才能使用它,这就是我遇到的问题。 我无法找到有关如何在Android上使用RestLet实现此功能的任何有用的文章或类似内容。我知道如何使用Android Developers 中的代码执行此操作,但我需要使用Restlet类来执行此操作。

我设法实现了一些将执行GET方法的代码(虽然很慢,从服务器获取数据大约需要20-30秒),但我遇到了PUT方法的问题。 我使用以下代码实现HTTPS客户端

private static ClientResource makeInstance(String url, Context con) {
    Reference reference = new Reference(url);
    Log.d("URL", url);
    String keyStoreFileAbsolutePath = PreferenceManager
            .getDefaultSharedPreferences(con).getString(
                    Constants.PREF_KEY_KEYSTORE_FILE_PATH, "");
    System.setProperty("javax.net.ssl.trustStore",keyStoreFileAbsolutePath);
    System.setProperty("javax.net.ssl.trustStorePassword", "ks090278d");
    System.setProperty("ssl.TrustManagerFactory.algorithm",
            javax.net.ssl.KeyManagerFactory.getDefaultAlgorithm());

    org.restlet.Context context = new org.restlet.Context();

    context.getAttributes().put("hostnameVerifier", new HostnameVerifier() {

        @Override
        public boolean verify(String arg0, SSLSession arg1) {
            return true;
        }

    });

    ClientResource resource = new ClientResource(context, reference);

    Engine.getInstance().getRegisteredClients().clear();
    Engine.getInstance().getRegisteredClients()
            .add(new HttpClientHelper(null));

    resource.release();

    return resource;
}

我正在使用它

ClientResource request = new ClientResource(url);
    request.setRetryAttempts(0);

    Series<Header> responseHeaders = (Series<Header>) request.getResponse()
            .getAttributes().get("org.restlet.http.headers");
    if (responseHeaders == null) {
        responseHeaders = new Series(Header.class);
        request.getRequestAttributes().put("org.restlet.http.headers",
                responseHeaders);
    }
    responseHeaders.add(new Header("Accept", "application/json;"));
    responseHeaders.add(new Header("Content-Type", "application/json;"));
    responseHeaders.add(new Header("Authorization",
            "Basic ZXN0dWRlbnQ6YW5kcm9pZA==;"));

    try {
        request.put(new JsonRepresentation(jsonString));        
        Response response = request.getResponse();
        if (response != null) {
            Log.d("Response", "HTTP Response: " + response.toString());
            ResponseHandler
                    .handleResponse(response);
        }
    } catch (Exception e) {

    }

当我执行此请求时,我得到&#34;内部服务器错误 - 500&#34;。我只使用基本相同的GET方法代码

request.put(new JsonRepresentation(jsonString));

我正在做

request.get();

并且它有效(尽管如上所述,速度很慢)。

我检查了这是否是由于服务器出现了一些错误,但我认为不是因为当我使用类似于Android开发者代码的代码时以及我使用的代码时,我设法得到了适当的响应尝试从Chrome中的RestClient执行PUT到相同的URL。

任何人都可以给我任何建议如何让这个工作?我不确定我的方法是否适合开始,可能是我从一开始就走错了方向。 事先提前了。

0 个答案:

没有答案