您的位置:首页 > 理论基础 > 计算机网络

android https通过载入pfx证书获取数据

2016-01-03 16:08 656 查看
直接给代码吧。研究了几天才搞定......

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不能初始化为空.....问题攻克了......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: