本文共 5391 字,大约阅读时间需要 17 分钟。
TrustManager tm = new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { //do nothing,接受任意客户端证书 } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { //do nothing,接受任意服务端证书 } @Override public X509Certificate[] getAcceptedIssuers() { return null; }};sslContext.init(null, new TrustManager[] { tm }, null); HostnameVerifier hnv = new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { // Always return true,接受任意域名服务器 return true; }};HttpsURLConnection.setDefaultHostnameVerifier(hnv); try { CertificateFactory cf = CertificateFactory.getInstance("X.509"); InputStream caInput = new BufferedInputStream(getAssets().open("uwca.crt")); Certificate ca; try { ca = cf.generateCertificate(caInput); } finally { caInput.close(); } KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); keyStore.load(null, null); keyStore.setCertificateEntry("ca", ca); TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(keyStore); SSLContext context = SSLContext.getInstance("TLSv1","AndroidOpenSSL"); context.init(null, tmf.getTrustManagers(), null); URL url = new URL("https://certs.cac.washington.edu/CAtest/"); HttpsURLConnection urlConnection = (HttpsURLConnection)url.openConnection(); urlConnection.setSSLSocketFactory(context.getSocketFactory()); InputStream in = urlConnection.getInputStream(); copyInputStreamToOutputStream(in, System.out);} catch (CertificateException e) { e.printStackTrace();} catch (IOException e) { e.printStackTrace();} catch (NoSuchAlgorithmException e) { e.printStackTrace();} catch (KeyStoreException e) { e.printStackTrace();} catch (KeyManagementException e) { e.printStackTrace();} catch (NoSuchProviderException e) { e.printStackTrace();} 这种方式确保了只有与特定服务器通信时,才能成功验证证书,从而提升安全性。
try { CertificateFactory cf = CertificateFactory.getInstance("X.509"); InputStream caInput = new BufferedInputStream(getAssets().open("uwca.crt")); final Certificate ca; try { ca = cf.generateCertificate(caInput); } finally { caInput.close(); } SSLContext context = SSLContext.getInstance("TLSv1","AndroidOpenSSL"); context.init(null, new TrustManager[]{ new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { for (X509Certificate cert : chain) { cert.checkValidity(); try { cert.verify(((X509Certificate) ca).getPublicKey()); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (NoSuchProviderException e) { e.printStackTrace(); } catch (SignatureException e) { e.printStackTrace(); } } } @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } } }, null); URL url = new URL("https://certs.cac.washington.edu/CAtest/"); HttpsURLConnection urlConnection = (HttpsURLConnection)url.openConnection(); urlConnection.setSSLSocketFactory(context.getSocketFactory()); InputStream in = urlConnection.getInputStream(); copyInputStreamToOutputStream(in, System.out);} catch (CertificateException e) { e.printStackTrace();} catch (IOException e) { e.printStackTrace();} catch (NoSuchAlgorithmException e) { e.printStackTrace();} catch (KeyManagementException e) { e.printStackTrace();} catch (NoSuchProviderException e) { e.printStackTrace();} 这种方式允许开发者根据具体需求,自定义验证逻辑,例如验证证书是否过期或签名是否合法,从而进一步提升安全性。
SSLSocketFactory sf = new MySSLSocketFactory(trustStore);sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
通过这些措施,我们可以有效防范HTTPS通信中的安全漏洞,确保数据传输的安全性。
转载地址:http://cshfk.baihongyu.com/