繁体   English   中英

当Android没有看到证书时,如何在Android中调用安全(SSL)Web服务?

[英]How do I call a secure (SSL) webservice in Android, when Android does not see the certificate?

我是Android新手,我很难为Android应用程序调用SSL Web服务。 我的代码如下:

Log.v("fs", "Making HTTP call...");
HttpClient http = new DefaultHttpClient();
HttpGet request = new HttpGet("https://example.com/api");

try {

    String response = http.execute(request, new BasicResponseHandler());
    Log.v("fs", response);

} catch (Exception e) {

    Log.v("fs", e.toString());
}

输出是:

Making HTTP call...
javax.net.SSLPeerUnverifiedException: No peer certificate

任何使这项工作的建议都会很棒。

我应该注意,这是一个有效的证书。 它由官方CA签署。

您是否测试过移动日期和小时是否正确?如果您使用SSL并且在1990年使用移动设备它将返回

javax.net.SSLPeerUnverifiedException:没有对等证书

问候

SchemeRegistry schemeRegistry = new SchemeRegistry(); 
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
schemeRegistry.register(new Scheme("mxiss", SSLSocketFactory.getSocketFactory(), 443));


HttpParams params = new BasicHttpParams(); 
int timeoutConnection = 5000; 
HttpConnectionParams.setConnectionTimeout(params, timeoutConnection); 
int timeoutSocket = 10000; 
HttpConnectionParams.setSoTimeout(params, timeoutSocket);

params.setParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 30); 

params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean); 

params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false); 

HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);


ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);

_client = new DefaultHttpClient(cm, params);

请尝试以下方法。 我已经添加了SSLSocketFactory来处理SSL连接,此外它还增加了使用ThreadSafeClientConnManager同时处理多个连接的支持。 您可以删除套接字超时和连接超时。

    SchemeRegistry schemeRegistry = new SchemeRegistry();
    schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    schemeRegistry.register(new Scheme("mxiss", SSLSocketFactory.getSocketFactory(), 443));

    HttpParams params = new BasicHttpParams();
    int timeoutConnection = 5000;
    HttpConnectionParams.setConnectionTimeout(params, timeoutConnection);
    int timeoutSocket = 10000;
    HttpConnectionParams.setSoTimeout(params, timeoutSocket);
    params.setParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 30);
    params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean(30));
    params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false);
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);

    ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);

    _client = new DefaultHttpClient(cm, params);

希望这可以帮助。

如果您的客户端不信任服务器证书,则注册不同的协议并接受该协议的所有证书。 你应该在做任何事之前首先注册协议。

Protocol mxiss = new Protocol("mxiss", new EasySSLProtocolSocketFactory(), 443);
Protocol.registerProtocol("mxiss", mxiss);

然后,而不是“https”你必须使用“mxiss”

EasySSLProtocolSocketFactory来自org.apache.commons.httpclient.contrib.ssl。 将jar文件http://repo1.maven.org/maven2/ca/juliusdavies/not-yet-commons-ssl/0.3.11/not-yet-commons-ssl-0.3.11.jar放在类路径中。

我也认为这是服务器证书的问题。 请查看此处给出的InstallCert.java程序: http//blogs.oracle.com/andreas/entry/no_more_unable_to_find 这可以是验证服务器证书的好方法。 如果您无法使用此程序下载,我会说,再次验证您的服务器。
在此处使用此程序后发布您的结果,我们将从那里开始。

我假设你不能拥有HTTPS webservice。 只有允许的方法是POST尝试并看到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM