Java 当Android没有看到证书时,如何在Android中调用安全(SSL)Web服务?
我是Android新手,我正在努力为Android应用程序调用SSL web服务。我的代码如下:Java 当Android没有看到证书时,如何在Android中调用安全(SSL)Web服务?,java,android,httpclient,Java,Android,Httpclient,我是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 BasicRes
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签署。我也认为这是服务器证书的问题。请查看此处提供的InstallCert.java程序:。这是验证服务器证书的好方法。如果您无法使用此程序下载,我会说,请再次验证您的服务器。
使用此程序后,请在此处发布您的结果,我们将从此处开始使用。我假设您无法获得HTTPS Web服务。唯一允许的方法是POST-try和see 试试下面的方法。我已经添加了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文件放在类路径中。您测试过移动日期和时间是否正确吗??,如果您使用SSL并在1990年使用移动设备,它将返回 javax.net.SSLPeerUnverifiedException:没有对等证书
关于SSL证书是否有效,或者您是否正在使用某个开发服务器?可能这与我的问题相同,您是否找到了解决此问题的有效方法?@mmattax:您解决了此问题吗?如果是,您可以发布您的解决方案作为答案吗?我编译并运行了该程序,输出:启动SSL握手…无错误,证书已被信任ID您尝试我发送给您的链接以禁用SSL验证。如果这样做有效,那么你就知道问题出在哪里了。我记得godaddy的ssl证书有点怪。链接死了,我们能在别处找到吗?我的机器上有java文件。不知道如何分享?如果我把它像hotfile或RapidShare之类放到网站上可以吗?这个java文件是ORACLE的版权所有。你好,Michael,请试试这个:你从哪里得到这个文件的。你知道吗,还是你只是在猜测。事实上,即使对于HTTPS,所有标准HTTP方法都是允许的。如果GET不被允许,那么当通过HTTPS访问网页时,您将无法在浏览器中获取任何网页。这个答案是如此错误,以至于我希望我能再投一次反对票。HTTPS和POST在不同的层中是两个不同的东西。我有相同的问题,您的解决方案似乎没有任何影响:-(.在我的案例中,问题在于我的android设备不信任CA颁发的根证书。android上的Firefox似乎使用自己的根证书,Windows也信任它,但使用设备标准受信任CA的应用程序存在问题。
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);