1. 程式人生 > >http轉換https

http轉換https

因最近專案需要,將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;
                }
            })

再次訪問,就應該沒問題了。