将真正的中间证书添加到Android中

时间:2013-07-26 15:29:15

标签: android ssl-certificate

当我尝试在我的服务器和我的应用程序之间进行HTTP通信时,我在Android上面临SSL证书。我们正在开发一个与服务器通信的Web / iOS / Android应用程序。

直到今天,我不需要使用https,但随着我们产品的发展,它已成为强制性的。

我使用了我们的托管解决方案提供的证书,这是一个真实且值得信赖的证书(* .netopenservices.fr),由RapidSSL提供,受到Geotrust的信任(如果我读好Chrome告诉我的那个)。所以一切都应该工作正常。 它适用于Mac上的Chrome,Win8上的Chrome,Mac上的Firefox和iOS上的Safari(以及iOS中的应用程序)。

但问题是Android:它似乎错过了大多数(每个?)其他浏览器/操作系统内置的中间证书。我们在我们的应用程序和内置浏览器中使用了4.2.2下的nexus 7和2.3.5下的htc Explorer进行了测试,结果是相同的。调试我们的应用程序时出现错误,浏览器中出现基本的“SSL连接错误”。 这是堆栈跟踪,如果它可以帮助:

07-26 17:24:19.988: W/System.err(13833): org.springframework.web.client.ResourceAccessException: I/O error: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.; nested exception is javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
07-26 17:24:20.008: W/System.err(13833):    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:491)
07-26 17:24:20.008: W/System.err(13833):    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:439)
07-26 17:24:20.018: W/System.err(13833):    at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:237)
(some of our own stack)
07-26 17:24:20.018: W/System.err(13833): Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
07-26 17:24:20.018: W/System.err(13833):    at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:381)
07-26 17:24:20.018: W/System.err(13833):    at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:209)
07-26 17:24:20.018: W/System.err(13833):    at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:478)
07-26 17:24:20.018: W/System.err(13833):    at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)
07-26 17:24:20.018: W/System.err(13833):    at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
07-26 17:24:20.018: W/System.err(13833):    at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
07-26 17:24:20.018: W/System.err(13833):    at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:81)
07-26 17:24:20.018: W/System.err(13833):    at libcore.net.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:165)
07-26 17:24:20.018: W/System.err(13833):    at org.springframework.http.client.SimpleBufferingClientHttpRequest.executeInternal(SimpleBufferingClientHttpRequest.java:72)
07-26 17:24:20.018: W/System.err(13833):    at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:46)
07-26 17:24:20.018: W/System.err(13833):    at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:63)
07-26 17:24:20.018: W/System.err(13833):    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:476)
07-26 17:24:20.018: W/System.err(13833):    ... 8 more
07-26 17:24:20.018: W/System.err(13833): Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
07-26 17:24:20.018: W/System.err(13833):    at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:276)
07-26 17:24:20.018: W/System.err(13833):    at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:197)
07-26 17:24:20.018: W/System.err(13833):    at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:584)
07-26 17:24:20.018: W/System.err(13833):    at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method)
07-26 17:24:20.018: W/System.err(13833):    at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:378)
07-26 17:24:20.018: W/System.err(13833):    ... 19 more
07-26 17:24:20.018: W/System.err(13833): Caused by: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
07-26 17:24:20.028: W/System.err(13833):    ... 24 more

我们显然不能相信我们应用中的每个证书,因为它将存储在商店中,保存敏感数据等等......

我们也不能要求用户做任何事情,除了使用应用程序(大多数用户会退出...)

有没有办法让安全且简单地让Android信任/知道这个合法缺失(中级?)证书?

感谢您的帮助!

编辑:3个证书(netopenservices.fr.2048.key,.fr.CA.crt和.fr.crt)存储在我们服务器的密钥库中(Tomcat6.0.37)

1 个答案:

答案 0 :(得分:0)

这已由我们的主机公司解决,主要是通过更换证书并将缺少的证书添加到服务器中。

享受!