Java DefaultHttpClient、证书、Https和发布问题!

Java DefaultHttpClient、证书、Https和发布问题!,java,android,post,https,certificate,Java,Android,Post,Https,Certificate,我的应用程序需要能够发布到https并保留使用cookie创建的会话。到目前为止,我有几种不同的方法来解决这个问题,但没有一种有效。目前我正在研究使用DefaultHttpClient,因为它应该自动保留使用cookie创建的会话。这让我省去了阅读cookie和提交其他帖子的痛苦。但是,当我尝试使用我拥有的代码进行post时,post失败,出现下面列出的证书错误 早些时候,我用另一种方法解决了这个问题,并使它与HttpsURLConnection一起工作,但这不会自动保留带有Cookie的会话

我的应用程序需要能够发布到https并保留使用cookie创建的会话。到目前为止,我有几种不同的方法来解决这个问题,但没有一种有效。目前我正在研究使用DefaultHttpClient,因为它应该自动保留使用cookie创建的会话。这让我省去了阅读cookie和提交其他帖子的痛苦。但是,当我尝试使用我拥有的代码进行post时,post失败,出现下面列出的证书错误

早些时候,我用另一种方法解决了这个问题,并使它与HttpsURLConnection一起工作,但这不会自动保留带有Cookie的会话

有人能看一下我的代码,告诉我我做错了什么,我能做得更好,需要做些什么来让它工作。?谢谢

我已经试着解决这个问题好几天了,现在我知道在哪里了。每次我再往前走一点,我就会被推得更远。有人能帮我吗!=)


此问题是由于客户端应用程序无法验证从信任锚点(根受信任的证书颁发机构)和SSL服务器证书生成的证书路径。因此,此证书不受信任,SSL握手失败

ApacheHttpClient API提供了一个很好的特性,可以帮助您。
SSLSocketFactory
构造函数包含受信任的证书

然后你可以:

  • 使用直接包含根CA证书或服务器证书的
    keytool
    创建
    KeyStore
  • 将此密钥库添加到应用程序中
  • 使用此
    密钥库构建SSLSocketFactory

  • 关于所有技术细节和代码片段,您可以阅读Bob Lee的这篇博文:

    一旦我有机会尝试此解决方案。我以前已经试过一次,但没有效果。然而,从那以后,我做了一些改变,并将再次尝试。感谢如果服务器不发送中间CA证书,也会发生此错误。在这种情况下,应用程序无法将证书链附加到信任锚点。你对此有什么解释吗?有没有办法绕过它,因为它不是我的服务器。
    //my posting function
        private static String post(String urlString, List<NameValuePair> nameValuePairs)
        throws MalformedURLException, ProtocolException, IOException {
            DataOutputStream ostream = null;
    
            HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
    
            DefaultHttpClient client = new DefaultHttpClient();
    
            SchemeRegistry registry = new SchemeRegistry();
            SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
            socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
            registry.register(new Scheme("https", socketFactory, 443));
            SingleClientConnManager mgr = new SingleClientConnManager(client.getParams(), registry);
            DefaultHttpClient http = new DefaultHttpClient(mgr, client.getParams());
    
            HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
    
            HttpPost httppost = new HttpPost(urlString);
    
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    
            HttpResponse response = http.execute(httppost);
    
            return response.toString();
    }
    
    //the error
    04-12 00:37:43.941: WARN/System.err(284): javax.net.ssl.SSLException: Not trusted server certificate
    04-12 00:37:43.961: WARN/System.err(284):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:371)
    04-12 00:37:43.961: WARN/System.err(284):     at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:92)
    04-12 00:37:43.970: WARN/System.err(284):     at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:381)
    04-12 00:37:43.980: WARN/System.err(284):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:164)
    04-12 00:37:43.980: WARN/System.err(284):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    04-12 00:37:43.992: WARN/System.err(284):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    04-12 00:37:44.000: WARN/System.err(284):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:348)
    04-12 00:37:44.000: WARN/System.err(284):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
    04-12 00:37:44.000: WARN/System.err(284):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
    04-12 00:37:44.020: WARN/System.err(284):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
    04-12 00:37:44.020: WARN/System.err(284):     at cpe495.smartapp.SmartDBHelper.post(SmartDBHelper.java:208)
    04-12 00:37:44.030: WARN/System.err(284):     at cpe495.smartapp.SmartDBHelper.authenticate(SmartDBHelper.java:105)
    04-12 00:37:44.030: WARN/System.err(284):     at cpe495.smartapp.DataSender.submitData(DataSender.java:28)
    04-12 00:37:44.040: WARN/System.err(284):     at cpe495.smartapp.DataSender.sendData(DataSender.java:21)
    04-12 00:37:44.051: WARN/System.err(284):     at cpe495.smartapp.SmartApp$1.dataReceivedReceived(SmartApp.java:60)
    04-12 00:37:44.061: WARN/System.err(284):     at cpe495.smartapp.ConnectDevice.fireDataReceivedEvent(ConnectDevice.java:287)
    04-12 00:37:44.061: WARN/System.err(284):     at cpe495.smartapp.ConnectDevice.run(ConnectDevice.java:254)
    04-12 00:37:44.071: WARN/System.err(284):     at java.lang.Thread.run(Thread.java:1096)
    04-12 00:37:44.071: WARN/System.err(284): Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: TrustAnchor for CertPath not found.
    04-12 00:37:44.090: WARN/System.err(284):     at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:168)
    04-12 00:37:44.100: WARN/System.err(284):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:366)
    04-12 00:37:44.110: WARN/System.err(284):     ... 17 more
    04-12 00:37:44.110: WARN/System.err(284): Caused by: java.security.cert.CertPathValidatorException: TrustAnchor for CertPath not found.
    04-12 00:37:44.129: WARN/System.err(284):     at org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi.engineValidate(PKIXCertPathValidatorSpi.java:149)
    04-12 00:37:44.150: WARN/System.err(284):     at java.security.cert.CertPathValidator.validate(CertPathValidator.java:202)
    04-12 00:37:44.150: WARN/System.err(284):     at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:164)
    04-12 00:37:44.150: WARN/System.err(284):     ... 18 more