Android HTTPS

http://wangtaoenter.iteye.com/blog/1336614

Android 支持HTTPS

关键点:

1.Android仅支持BouncyCastle,BKS密库

2.生成密钥

   keytool -genkey -alias tomcat -keyalg RSA -keystore server.keystore -validity 3600

   keytool -export -alias tomcat -file server.cer -keystore server.keystore -storepass 123456

   keytool -import -alias tomcat -file server.cer -keystore server_trust.keystore -storepass 123456 -storetype BKS -providername "BC"

参见:http://anjxue.iteye.com/blog/1140275

 

 

code:

Java代码   收藏代码
  1. public class HttpsDemo extends Activity implements OnClickListener  
  2. {  
  3.     private static final String TAG = "HttpsDemo";  
  4.     private static final String HTTS_URL = "https://192.168.7.39:8443/";  
  5.     private EditText editText;  
  6.     private Button button;  
  7.   
  8.     /** 
  9.      * 私钥密码 
  10.      */  
  11.     private static final String CLIENT_KET_PASSWORD = "123456";  
  12.   
  13.     /** 
  14.      * 信任证书密码 
  15.      */  
  16.     private static final String CLIENT_TRUST_PASSWORD = "123456";  
  17.   
  18.     /** 
  19.      * 使用协议 
  20.      */  
  21.     private static final String CLIENT_AGREEMENT = "TLS";  
  22.   
  23.     /** 
  24.      * 密钥管理器 
  25.      */  
  26.     private static final String CLIENT_KEY_MANAGER = "X509";  
  27.   
  28.     /** 
  29.      * 信任证书管理器 
  30.      */  
  31.     private static final String CLIENT_TRUST_MANAGER = "X509";  
  32.   
  33.     /** 
  34.      * 密库,这里用的是BouncyCastle密库 
  35.      */  
  36.     private static final String CLIENT_KEY_KEYSTORE = "BKS";  
  37.   
  38.     /** 
  39.      * 密库,这里用的是BouncyCastle密库 
  40.      */  
  41.     private static final String CLIENT_TRUST_KEYSTORE = "BKS";  
  42.   
  43.     private AssetManager mAssetManager = null;  
  44.   
  45.     @Override  
  46.     protected void onCreate(Bundle savedInstanceState)  
  47.     {  
  48.         super.onCreate(savedInstanceState);  
  49.         setContentView(R.layout.https_demo);  
  50.   
  51.         mAssetManager = getAssets();  
  52.   
  53.         editText = (EditText) findViewById(R.id.url_entry_text);  
  54.         button = (Button) findViewById(R.id.go_url_btn);  
  55.   
  56.         editText.setText(HTTS_URL);  
  57.         button.setOnClickListener(this);  
  58.     }  
  59.   
  60.     @Override  
  61.     public void onClick(View v)  
  62.     {  
  63.         connect(editText.getText().toString());  
  64.     }  
  65.   
  66.     private void connect(String httpsUrl)  
  67.     {  
  68.         java.net.URL url = null;  
  69.         HttpsURLConnection conn = null;  
  70.         InputStream inputs = null;  
  71.   
  72.         try  
  73.         {  
  74.             //取得SSL的SSLContext实例     
  75.             SSLContext sslContext = SSLContext.getInstance(CLIENT_AGREEMENT);  
  76.             //取得KeyManagerFactory实例     
  77.             KeyManagerFactory keyManager = KeyManagerFactory  
  78.                 .getInstance(CLIENT_KEY_MANAGER);  
  79.             //取得TrustManagerFactory的X509密钥管理器  
  80.             TrustManagerFactory trustManager = TrustManagerFactory  
  81.                 .getInstance(CLIENT_TRUST_MANAGER);  
  82.   
  83.             //取得BKS密库实例     
  84.             KeyStore keyKeyStore = KeyStore.getInstance(CLIENT_KEY_KEYSTORE);  
  85.             KeyStore trustKeyStore = KeyStore  
  86.                 .getInstance(CLIENT_TRUST_KEYSTORE);  
  87.   
  88.             //加载证书和私钥,通过读取资源文件的方式读取密钥和信任证书(kclient:密钥;lt_client:信任证书)   
  89.             InputStream is = mAssetManager.open("trust.keystore");  
  90.             //kclient:密钥  
  91.             keyKeyStore.load(is, CLIENT_KET_PASSWORD.toCharArray());  
  92.             is.reset();  
  93.             //lt_client:信任证书  
  94.             trustKeyStore.load(is, CLIENT_TRUST_PASSWORD.toCharArray());  
  95.             is.close();  
  96.   
  97.             //初始化密钥管理器、信任证书管理器  
  98.             keyManager.init(keyKeyStore, CLIENT_KET_PASSWORD.toCharArray());  
  99.             trustManager.init(trustKeyStore);  
  100.   
  101.             //初始化SSLContext     
  102.             sslContext.init(keyManager.getKeyManagers(),  
  103.                 trustManager.getTrustManagers(), null);  
  104.   
  105.             url = new URL(HTTS_URL);  
  106.             conn = (HttpsURLConnection) url.openConnection();  
  107.             conn.setSSLSocketFactory(sslContext.getSocketFactory());  
  108.             conn.setHostnameVerifier(new TrustAnyHostnameVerifier());  
  109.   
  110.             conn.setDoInput(true);  
  111.             conn.setDoOutput(true);  
  112.             conn.setRequestProperty("Accept""*/*");  
  113.             conn.setRequestProperty("Pragma""No-cache");  
  114.             conn.setRequestProperty("Cache-Control""no-cache");  
  115.             conn.setRequestProperty("connection""keep-alive");  
  116.             conn.setRequestProperty("accept-charset""utf-8");  
  117.             conn.setRequestProperty("Content-Type""text/xml");  
  118.   
  119.             conn.setConnectTimeout(30000);  
  120.             conn.setReadTimeout(30000);  
  121.   
  122.             conn.setRequestMethod("GET");  
  123.   
  124.             // 执行到该句就是开始建立连接并取得连接的响应结果  
  125.             int code = conn.getResponseCode();  
  126.   
  127.             Log.i(TAG, "http response code is " + code);  
  128.   
  129.             inputs = conn.getInputStream();  
  130.   
  131.             int size = conn.getContentLength();  
  132.   
  133.             Log.i(TAG, "getContentLength" + size);  
  134.   
  135.             byte[] buf = new byte[10000];  
  136.             inputs.read(buf);  
  137.             Log.d(TAG, "res:" + new String(buf));  
  138.   
  139.         }  
  140.         catch (MalformedURLException e)  
  141.         {  
  142.             e.printStackTrace();  
  143.         }  
  144.         catch (IOException e)  
  145.         {  
  146.             e.printStackTrace();  
  147.         }  
  148.         catch (NoSuchAlgorithmException e)  
  149.         {  
  150.             e.printStackTrace();  
  151.         }  
  152.         catch (KeyManagementException e)  
  153.         {  
  154.             e.printStackTrace();  
  155.         }  
  156.         catch (KeyStoreException e)  
  157.         {  
  158.             e.printStackTrace();  
  159.         }  
  160.         catch (CertificateException e)  
  161.         {  
  162.             e.printStackTrace();  
  163.         }  
  164.         catch (UnrecoverableKeyException e)  
  165.         {  
  166.             e.printStackTrace();  
  167.         }  
  168.         finally  
  169.         {  
  170.             if (conn != null)  
  171.             {  
  172.                 conn.disconnect();  
  173.             }  
  174.         }  
  175.   
  176.     }  
  177.   
  178.     public class TrustAnyHostnameVerifier implements HostnameVerifier  
  179.     {  
  180.         public boolean verify(String hostname, SSLSession session)  
  181.         {  
  182.             return true;  
  183.         }  
  184.     }  
  185. }  

你可能感兴趣的:(Android HTTPS)