[英]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.