Java 当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

我是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签署。

我也认为这是服务器证书的问题。请查看此处提供的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);