我正在回答这个问题,以便根据android开发人员站点给出有关方案和解决方案的想法,以使他人受益。我已经使用自定义信任管理器解决了这个问题。
问题出在服务器证书上,它缺少中间证书颁发机构。但是,第一个流证书路径以某种方式完成,结果是成功进行了证书路径验证。
android开发人员网站中对此有解决方案。建议使用信任此服务器证书的自定义信任管理器,或者建议服务器在服务器链中包括中间CA。
自定义信任管理器。来源:https : //developer.android.com/training/articles/security-
ssl.html#UnknownCa
// Load CAs from an InputStream// (could be from a resource or ByteArrayInputStream or ...)CertificateFactory cf = CertificateFactory.getInstance("X.509");// From https://www.washington.edu/itconnect/security/ca/load-der.crtInputStream caInput = new BufferedInputStream(new FileInputStream("load-der.crt"));Certificate ca;try { ca = cf.generateCertificate(caInput); System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN());} finally { caInput.close();}// Create a KeyStore containing our trusted CAsString keyStoreType = KeyStore.getDefaultType();KeyStore keyStore = KeyStore.getInstance(keyStoreType);keyStore.load(null, null);keyStore.setCertificateEntry("ca", ca);// Create a TrustManager that trusts the CAs in our KeyStoreString tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);tmf.init(keyStore);// Create an SSLContext that uses our TrustManagerSSLContext context = SSLContext.getInstance("TLS");context.init(null, tmf.getTrustManagers(), null);// Tell the okhttp to use a SocketFactory from our SSLContextOkHttpClient okHttpClient client = new OkHttpClient.Builder().sslSocketFactory(context.getSocketFactory()).build();更新:
从服务器端将中间证书颁发机构添加到证书链后,我的问题得到解决。这是最好的解决方案,将证书与应用程序捆绑在一起需要在证书到期或与证书管理相关的任何其他问题时更新应用程序。
更新:03/09/2017 加载证书文件的最简单方法是使用原始资源。
InputStream caInput = new BufferedInputStream(context .getResources().openRawResource(R.raw.certfilename));
其中certfilename是放置在resources /
raw文件夹中的证书文件。还不
sslSocketFactory(SSLSocketFactorysslSocketFactory)建议使用okhttp ,建议使用okhttp api文档中的建议方法。
另外,从服务器获取证书时,最好使用openssl。
openssl s_client -connect {server-address}:{port} -showcerts因为我以前是从firefox那里抢来的,并且遇到了病毒防护人员更改了它的情况。



