5

我想導入我自己的BKS文件,其中包含我的自簽名證書,但我遇到okHTTP的麻煩。我想用bks文件來做到這一點,我也通過sha512 /來實現它。正方形okHTTP證書鎖定 - sslSocketFactory錯誤

我已經從幾個教程得到了這段代碼,我知道那裏的問題是,但無法修復它。

import android.content.Context; 
import android.util.Log; 

import java.io.InputStream; 
import java.security.KeyStore; 

import javax.net.ssl.SSLContext; 
import javax.net.ssl.SSLSocketFactory; 
import javax.net.ssl.TrustManagerFactory; 

import okhttp3.OkHttpClient; 
import okhttp3.Request; 
import okhttp3.Response; 

public class Pinning 
{ 
    Context context; 
    public static String TRUST_STORE_PASSWORD = "your_secret"; 
    private static final String ENDPOINT = "https://api.yourdomain.com/"; 

public Pinning(Context c) { 
    this.context = c; 
} 

private SSLSocketFactory getPinnedCertSslSocketFactory(Context context) { 
    try { 
     KeyStore trusted = KeyStore.getInstance("BKS"); 
     InputStream in = context.getResources().openRawResource(R.raw.mytruststore); 
     trusted.load(in, "mypass".toCharArray()); 
     SSLContext sslContext = SSLContext.getInstance("TLS"); 
     TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
       TrustManagerFactory.getDefaultAlgorithm()); 
     trustManagerFactory.init(trusted); 
     sslContext.init(null, trustManagerFactory.getTrustManagers(), null); 
     return sslContext.getSocketFactory(); 
    } catch (Exception e) { 
     Log.e("MyApp", e.getMessage(), e); 
    } 
    return null; 
} 


public void makeRequest() { 
    try { 
     OkHttpClient client = new OkHttpClient().sslSocketFactory(getPinnedCertSslSocketFactory(this.context)); 

     Request request = new Request.Builder() 
       .url(ENDPOINT) 
       .build(); 

     Response response = client.newCall(request).execute(); 

     Log.d("MyApp", response.body().string()); 

    } catch (Exception e) { 
     Log.e("MyApp", e.getMessage(), e); 

    } 
} 
} 

現在我得到下面的行內出現以下錯誤:

OkHttpClient client = new OkHttpClient().sslSocketFactory(getPinnedCertSslSocketFactory(this.context)).; 

錯誤:okHTTPClient

的SSLSocketFactory cannt應用於javax.net.SSLSocketFactory。

如果您查看導入內容,您會看到javax中的以下3項。

import javax.net.ssl.SSLContext; 
import javax.net.ssl.SSLSocketFactory; 
import javax.net.ssl.TrustManagerFactory; 

所以我錯了。似乎我需要一個okHTTP - sslSocketFactory與我的bks文件。但我無法找到一個工作的解釋。我也使用okHTTP 3.3.1

compile 'com.squareup.okhttp3:okhttp:3.3.1' 

我發現,說明/解決方案在這裏:How can I pin a certificate with Square OKHTTP?。正如之前所提。我想使用bks文件,而不是sha512 /方法。

因此,我需要知道,如何將javax.ssl.Factory解析到okHTTP-sslFactory中,或者如何使用生成bks文件創建okHTTPsslFactory。

此外,okHTTP 3.1.1中不再提供setSSLSocketFactory方法。

我非常感謝您的幫助,並感謝您花時間來解決這個問題!

回答

0

應使用以下語法而不是

OkHttpClient client = new OkHttpClient.Builder() 
      .sslSocketFactory(getPinnedCertSslSocketFactory(this.context)) 
      .build(); 

希望它能幫助!

+1

哦,男人謝謝你!我遲到了!我忘了添加.Builder()。對我感到羞恥:/ – user3325230