zoukankan      html  css  js  c++  java
  • android https通过载入pfx证书获取数据

    直接给代码吧。研究了几天才搞定......

    public static final String CLIENT_KET_PASSWORD = "Ku6OpqKDfN4=305790"; //
    
    	public static String getNewHttpClient(String url)
    	{
    
    		try
    		{
    			// KeyStore trustStore = KeyStore.getInstance("PKCS12", "BC");
    			// trustStore
    			// .load(PcPostApplication.getInstance().getAssets()
    			// .open("abc.pfx"), CLIENT_KET_PASSWORD.toCharArray());
    			SSLSocketFactory sf =
    					new SSLSocketFactoryEx(AppConfig.mKeyStore,
    							AppConfig.CERTFILE_PASSWORD.toCharArray());
    			sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
    
    			HttpParams params = new BasicHttpParams();
    			HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
    			HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
    
    			SchemeRegistry registry = new SchemeRegistry();
    			registry.register(new Scheme("http", PlainSocketFactory
    					.getSocketFactory(), 80));
    			registry.register(new Scheme("https", sf, 443));
    
    			HttpClient client = null;
    			String msg = "";
    			try
    			{
    				ClientConnectionManager ccm =
    						new ThreadSafeClientConnManager(params, registry);
    				client = new DefaultHttpClient(ccm, params);
    				HttpGet hg = new HttpGet(url);
    				HttpResponse response = client.execute(hg);
    				HttpEntity entity = response.getEntity();
    				if (entity != null)
    				{
    					InputStream instreams = entity.getContent();
    					msg = convertStreamToString(instreams);
    				}
    				return msg;
    			}
    			catch (Exception e)
    			{
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		catch (Exception e)
    		{
    			e.printStackTrace();
    		}
    		return "";
    	}
    
    	public static String convertStreamToString(InputStream is)
    	{
    		BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    		StringBuilder sb = new StringBuilder();
    
    		String line = "";
    		try
    		{
    			while ((line = reader.readLine()) != null)
    			{
    				sb.append(line + "
    ");
    			}
    		}
    		catch (IOException e)
    		{
    			e.printStackTrace();
    		}
    		finally
    		{
    			try
    			{
    				is.close();
    			}
    			catch (IOException e)
    			{
    				e.printStackTrace();
    			}
    		}
    		return sb.toString();
    	}
    上面的载入证书并请求,可是在这须要注意一个问题SSLSocketFactory须要自己定义,看以下自己定义的代码:


    public class SSLSocketFactoryEx extends SSLSocketFactory
    {
    
    	SSLContext sslContext = SSLContext.getInstance("TLS");
    
    	public SSLSocketFactoryEx(KeyStore truststore, char[] arry)
    			throws NoSuchAlgorithmException, KeyManagementException,
    			KeyStoreException, UnrecoverableKeyException
    	{
    		super(truststore);
    		KeyManagerFactory localKeyManagerFactory =
    				KeyManagerFactory.getInstance(KeyManagerFactory
    						.getDefaultAlgorithm());
    		localKeyManagerFactory.init(truststore, arry);
    		KeyManager[] arrayOfKeyManager =
    				localKeyManagerFactory.getKeyManagers();
    		TrustManager tm = new X509TrustManager()
    		{
    
    			@Override
    			public X509Certificate[] getAcceptedIssuers()
    			{
    				return null;
    			}
    
    			@Override
    			public void checkServerTrusted(X509Certificate[] chain,
    					String authType) throws CertificateException
    			{
    
    			}
    
    			@Override
    			public void checkClientTrusted(X509Certificate[] chain,
    					String authType) throws CertificateException
    			{
    
    			}
    		};
    
    		sslContext.init(arrayOfKeyManager, new TrustManager[] { tm },
    				new java.security.SecureRandom());
    	}
    
    	@Override
    	public Socket createSocket(Socket socket, String host, int port,
    			boolean autoClose) throws IOException, UnknownHostException
    	{
    		return sslContext.getSocketFactory().createSocket(socket, host, port,
    				autoClose);
    	}
    
    	@Override
    	public Socket createSocket() throws IOException
    	{
    		return sslContext.getSocketFactory().createSocket();
    	}
    }

    由于是双向握手,那个sslcontext不能初始化为空.....问题攻克了......

  • 相关阅读:
    IntelliJ IDEA 自定义 Generate POJOs.groovy 生成 POJO
    MyBatisPlus入门
    Angular中内置模块和自定义模块
    Angular跳转传值(get,动态路由,js)
    Angular路由配置
    Angular数据请求(get,post)
    Angular父子组件之间通讯传值
    Angular双向数据绑定
    Angular项目分析
    Angular环境搭建
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5096605.html
Copyright © 2011-2022 走看看