我是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官方签署。
答案 0 :(得分:2)
您是否测试过移动日期和小时是否正确?如果您使用的是SSL并且在1990年将其移动,则会返回
javax.net.SSLPeerUnverifiedException:没有对等证书
此致
答案 1 :(得分:1)
尝试以下方法。我已经添加了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);
然后您必须使用“mxiss”
而不是“https”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放在类路径中。
答案 2 :(得分:1)
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);
答案 3 :(得分:0)
我也认为这是服务器证书的问题。请查看此处给出的InstallCert.java程序:http://blogs.oracle.com/andreas/entry/no_more_unable_to_find。这可以是验证服务器证书的好方法。如果您无法使用此程序下载,我会说,再次验证您的服务器 在此处使用此程序后发布您的结果,我们将从那里开始。
答案 4 :(得分:-10)
我假设您无法使用HTTPS Web服务。只有允许的方法是POST尝试并看到。