2011-09-28 144 views
12

我使用SSL Socket和的TrustManager从这个方面Self signed SSL无法验证证书签名?

,但我不断收到以下错误:

09-28 19:52:41.942: WARN/System.err(10101): javax.net.ssl.SSLHandshakeException: org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate signature.

有什么不对? 我已经在stackoverflow上检查过不同的帖子,但我似乎无法让它正常工作。

我的代码:

SchemeRegistry schemeRegistry = new SchemeRegistry(); 

// http scheme 

schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 

// https scheme 

schemeRegistry.register(new Scheme("https", new EasySSLSocketFactory(), 443)); 
params = new BasicHttpParams(); 
params.setParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 1); 
params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean(1)); 
params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false); 
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
HttpProtocolParams.setContentCharset(params, "utf8"); 
CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); 
credentialsProvider.setCredentials(new AuthScope("www.example.com", AuthScope.ANY_PORT), 
    new UsernamePasswordCredentials("user", "password")); 
clientConnectionManager = new ThreadSafeClientConnManager(params, schemeRegistry); 
context = new BasicHttpContext(); 
context.setAttribute("http.auth.credentials-provider", credentialsProvider); 

DefaultHttpClient client = new DefaultHttpClient(clientConnectionManager, params); 

HttpGet get = new HttpGet("https://www.example.com/web/restricted/form/formelement=512663"); 
HttpResponse response = client.execute(get, context); 

Log.w("Response ","Status line : "+ response.toString()); 
+13

您可能还想检查手机上的日期和时间设置。如果时钟太远不同步你可以得到类似的错误。 –

回答

2

最可能的是服务器返回证书链,你不信任当局。 (指:权威证书不知道您的设备为受信任) 解决方法:仔细检查证书的HTTPS网站来了,有关当局添加到您的信任 - 而这部分似乎是棘手

(这里一些解释: http://groups.google.com/group/android-security-discuss/browse_thread/thread/0bf726de4f5275a3/391b900631d7f358

+0

嗨康斯坦丁, Thx的答复,但我想我必须以另一种方式登录到这个网站,这太复杂了。 我想登录的网站有一个可以通过HTTP提交的登录表单,然后通过身份验证登录并通过SSL重定向到我想要的页面。 我认为从HTTPGet保存cookie的HTTP Post应该做或? – Lars

+0

你没有那么做 - 你永远不会获得HTTPS连接。您可以通过提交HTTP表单来成功,但通过SSH重定向将不起作用,除非您对证书问题进行排序 - 这是您不信任服务器的一方。有趣的是,有些服务器有问题,而且无法验证客户端的签名(特别是JBoss有这个bug) –

20

正如迈克尔列维所说,我得到这个异常的原因是我已经离开我的Android模拟器打开了几天,时钟已经非常不同步。一旦我重新启动模拟器,异常就消失了。

+1

我在没有SIM卡的物理Galaxy Note设备上遇到类似的问题。有趣的是,内置浏览器工作正常。一旦我将时间同步设置更新为自动,我不再遇到任何错误。 –

+1

确实,我遇到了证书握手问题,并发现我的设备时间设置不正确。它在过去被设置为一些东西,并且ssl握手失败。 –

8

重要提示:

确保设备上的时间是正确的,证书也有有效期,如果日期是出厂设置后过去(通常是2000年1月1日不会验证重置)还是未来。设备将通过NTP自动同步,但在没有可用的Internet连接时显然不起作用。

+0

谢谢!!!!我已经把设备时间设置回了其他日期以测试显示的东西....然后忘记将其设置回来!愚蠢。谢谢! – marienke

1

顺便说一下,我们可以轻松地重新产生这个错误 - 只需将手机的日期更改为几年后。

注:错误可能是在不同的手机有点差异。有些人可能会证明证书已过期。