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 + "\n");
			}
		}
		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不能初始化为空.....问题解决了......

你可能感兴趣的:(android https通过加载pfx证书获取数据)