http轉換https
阿新 • • 發佈:2019-02-06
因最近專案需要,將http轉化為https,因此做個記錄。
1、首先去網站把證書下下來
最終得到一個.cer檔案
2、將 .cer 檔案轉換為 .bks檔案,將生成的 .bks 檔案放入 raw 目錄下
我用的是 bcprov-jdk15on-159.jar
輸入命令
keytool -importcert -v -trustcacerts -alias (別名,隨便取個名字) -file xx.cer(下載證書的全路徑) -keystore xxx.bks (生成檔案的全路徑) -storetype BKS -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath xxx.jar (你下載轉換工具的全路徑) -storepass xxxxxx(密碼,自定義)
注意:上述命令沒有換行,路徑最好用英文
3、程式碼中,增加以下程式碼即可。
okHttpClient.sslSocketFactory(SSLSocketFactory sslSocketFactory) /** * 獲取bks檔案的sslsocketfactory * @param context * @return */ public static SSLSocketFactory getSSLSocketFactory(Context context) { final String CLIENT_TRUST_PASSWORD = "123456";//信任證書密碼,該證書預設密碼是123456 final String CLIENT_AGREEMENT = "TLS";//使用協議 final String CLIENT_TRUST_KEYSTORE = "BKS"; SSLContext sslContext = null; try { //取得SSL的SSLContext例項 sslContext = SSLContext.getInstance(CLIENT_AGREEMENT); //取得TrustManagerFactory的X509金鑰管理器例項 TrustManagerFactory trustManager = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); //取得BKS密庫例項 KeyStore tks = KeyStore.getInstance(CLIENT_TRUST_KEYSTORE); InputStream is = context.getResources().openRawResource(R.raw.service); try { tks.load(is, CLIENT_TRUST_PASSWORD.toCharArray()); } finally { is.close(); } //初始化金鑰管理器 trustManager.init(tks); //初始化SSLContext sslContext.init(null, trustManager.getTrustManagers(), null); } catch (Exception e) { e.printStackTrace(); } return sslContext.getSocketFactory(); }
最後,如果執行中報錯:
javax.net.ssl.SSLPeerUnverifiedException: Hostname ***.****.**not verified
那麼,還需增加一行程式碼
okHttpClient.hostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } })
再次訪問,就應該沒問題了。