当前位置: 代码迷 >> Web前端 >> android前端与java web靠山的ssl交互
  详细解决方案

android前端与java web靠山的ssl交互

热度:534   发布时间:2012-06-26 10:04:13.0
android前端与java web后台的ssl交互

?

android前端与java web后台如何进行ssl交互(双向的)?

?

1、创建后台密钥(serverKey.jks)和android前端密钥(clientKey.bks),同样再创建后台信任库(serverTrust.jks)和android前端信任库(clientTrust.bks)。

?

2、将后台的密key导出证书server.cer,将前端的密key导出证书client.cer,将server.cer导入到前端信任库clientTrust.bks,将client.cer导入到后台的信任库serverTrust.jks,使前后互相信任(双向的)。

?

3、后台配置weblogic服务器中的ssl,如何配置,可Google一下

?

?

4、前端android请求,部分代码如下:

?

public final class SSLTransport
{
	private SSLSocketFactory sslSocketFactory = null;

	public String sendAndReceive(String requestUrl, String sid, String xml, SSLConfig sslConfig) throws Exception
	{
		String returnXml = null;
		OutputStream os = null;
		HttpsURLConnection connection = null;
		try
		{
		    System.setProperty("java.protocol.handler.pkgs", "javax.net.ssl");
		    HostnameVerifier hostnameVerifier = new HostnameVerifier()
		    {
		    	public boolean verify(String urlHostName, SSLSession session)
		    	{
		    		String peerHost = session.getPeerHost();
		    		if(peerHost.equalsIgnoreCase("localhost"))
		    		{
		    			peerHost = "192.168.0.119";
		    		}
		    		return urlHostName.equals(peerHost);
		    	}
		    };
		    HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);

		    URL url = new URL(requestUrl);
	        connection = (HttpsURLConnection)url.openConnection();
	        connection.setRequestMethod("POST");
	        connection.setRequestProperty("Content-Type", "text/xml;charset=GBK"); 
	        connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; FIREFOX 3.6; IBM AIX 5)");
			connection.setConnectTimeout(10 * 1000);
			connection.setDoOutput(true);
			connection.setDoInput(true);
			connection.setSSLSocketFactory(getSSLSocketFactory(sslConfig));
			connection.connect();
			writeStringToStream(connection.getOutputStream(), repairRacketXml(sid, xml));
			if(HttpsURLConnection.HTTP_OK == connection.getResponseCode())
			{
				returnXml = readStringFromStream(connection.getInputStream());
			}
		}
		finally
		{
			if(os != null)
			{
				os.close();
			}
			if(connection != null)
			{
				connection.disconnect();
			}
		}
		return returnXml;
	}

	/**
	 * 获取 SSLSocketFactory 实例。
	 * @param sslConfig SSLConfig 实例。
	 * @return SSLSocketFactory 实例。
	 * @throws Exception Exception 实例。
	 */
	private SSLSocketFactory getSSLSocketFactory(SSLConfig sslConfig) throws Exception
	{
		//取得SSLContext
		SSLContext sslContext = SSLContext.getInstance(sslConfig.getProtocol());
		//取得X509私钥管理器
		KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(sslConfig.getAlgorithm());
		//取得X509信任管理器
		TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(sslConfig.getAlgorithm());
		//取得私钥库实例
		KeyStore keyStore = KeyStore.getInstance(sslConfig.getStoreType());
		//取得信任库实例
		KeyStore trustkeyStore = KeyStore.getInstance(sslConfig.getStoreType());
		//加载私钥库
		keyStore.load(sslConfig.getIdentityStoreStream(), sslConfig.getIdentityStorePassword().toCharArray());
		//加载信任列表
        trustkeyStore.load(sslConfig.getTrustStoreStream(), sslConfig.getTrustStorePassword().toCharArray());
        //初始化私钥工厂
        keyManagerFactory.init(keyStore, sslConfig.getIdentityStorePassword().toCharArray());
        //初始化信任列表工厂
        trustManagerFactory.init(trustkeyStore);
        //初始化SSLContext
        sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
        //通过SSLContext取得SocketFactory
        if(sslSocketFactory == null)
        {
        	sslSocketFactory = sslContext.getSocketFactory();
        }
        //关闭输入流。
        sslConfig.getIdentityStoreStream().close();
        sslConfig.getTrustStoreStream().close();
        return sslSocketFactory;
	}

	/**
	 * 从输入流中获取字符串。
	 * @param is InputStream 实例。
	 * @return 结果字符串。
	 * @throws Exception Exception 实例。
	 */
	private String readStringFromStream(InputStream is) throws Exception
	{
		StringBuffer sb = new StringBuffer();
		InputStreamReader isr = null;
		BufferedReader br = null;
		try
		{
			String buffer = null;
			isr = new InputStreamReader(is, "GBK");
			br = new BufferedReader(isr);
			while((buffer = br.readLine()) != null)
			{
				sb.append(buffer);
			}
		}
		catch(Exception ex)
		{
			throw new Exception(ex);
		}
		finally
		{
			if(br != null)
			{
				br.close();
			}
			if(isr != null)
			{
				isr.close();
			}
			if(is != null)
			{
				is.close();
			}
		}
		return sb.toString().trim();
	}

	/**
	 * 将XML字符串写入输出流。
	 * @param os OutputStream 实例。
	 * @param xml XML字符串。
	 * @throws Exception Exception 实例。
	 */
	private void writeStringToStream(OutputStream os, String xml) throws Exception
	{
		OutputStreamWriter osw = null;
		try
		{
			osw = new OutputStreamWriter(os, "GBK");
			osw.write(xml);
			osw.flush();
		}
		catch(Exception ex)
		{
			throw new Exception(ex);
		}
		finally
		{
			if(osw != null)
			{
				osw.close();
			}
			if(os != null)
			{
				os.close();
			}
		}
	}

	/**
	 * 修复Packet形式的XML字符串。
	 * @param sid 服务请求ID。
	 * @param xml 请求XML。
	 * @return 修复后Packet形式的字符串。
	 * @throws Exception Exception 异常。
	 */
	private String repairRacketXml(String sid, String xml) throws Exception
	{
		Packet packet = PacketParser.parse(xml);
		packet.getHead().getService().setHandler(sid);
		return packet.toString();
	}
}
  相关解决方案